Heim  >  Artikel  >  Backend-Entwicklung  >  MongoDB-Pipeline-Betreiber

MongoDB-Pipeline-Betreiber

小云云
小云云Original
2017-12-06 14:09:182226Durchsuche

Freunde, die mit dem Linux-Betriebssystem vertraut sind, sollten wissen, dass es in Linux Pipes gibt, mit denen Daten bequem verarbeitet werden können. MongoDB Version 2.2 führt außerdem ein neues Datenaggregations-Framework ein. Ein Dokument kann eine Pipeline durchlaufen, die aus mehreren Knoten besteht. Jeder Knoten verfügt über seine eigenen Spezialfunktionen, z. B. Dokumentgruppierung, Dokumentfilterung usw. Jeder Knoten akzeptiert eine Reihe von Dokumenten. Führen Sie eine Typkonvertierung für diese Dokumente durch und übergeben Sie die konvertierten Dokumente dann an den nächsten Knoten. Der letzte Knoten gibt die Ergebnisse an den Client zurück. In diesem Artikel werfen wir zunächst einen Blick auf einige grundlegende Pipeline-Operatoren.

$match

$match kann zum Filtern von Dokumenten verwendet werden. Nachdem die Filterung abgeschlossen ist, können wir die erhaltenen Let's filtern Führen Sie eine Datenaggregation für die Dokumentteilmenge durch. Die zuvor eingeführten Abfrageoperatoren können in $match verwendet werden. Rufen Sie beispielsweise alle Dokumente in der Sammlung ab, deren Autor „Du Fu“ ist:

db.sang_collect.aggregate({$match:{author:"杜甫"}})

Bei der tatsächlichen Verwendung ist es am besten, $match vor der Pipeline zu platzieren, was die Arbeitslast der nachfolgenden Pipeline verringern kann. Gleichzeitig können wir den Index auch verwenden, wenn $match vor der Projektion und Gruppierung ausgeführt wird.

$project

Grundlegende Verwendung

$project kann wie folgt zum Extrahieren des gewünschten Felds verwendet werden:

db.sang_collect.aggregate({$project:{title:1,_id:0}})

1 bedeutet, dass das Feld ist erforderlich, 0 bedeutet, dass das Feld nicht benötigt wird, wie folgt:

db.sang_collect.aggregate({$project:{"articleTitle":"$title"}})

Es gibt jedoch ein Problem, das beachtet werden muss . Wenn für das ursprüngliche Feld ein Index vorhanden ist, benennen Sie es um. Es gibt keinen Index für das Feld, nachdem es benannt wurde. Daher ist es am besten, vor dem Umbenennen einen Index zu verwenden.

Mathematische Ausdrücke

Mathematische Ausdrücke können verwendet werden, um eine Reihe von Werten modulo zu addieren, zu subtrahieren, zu multiplizieren und zu dividieren. Meine Datenstruktur ist beispielsweise wie folgt:

{
    "_id" : ObjectId("59f841f5b998d8acc7d08863"),
    "orderAddressL" : "ShenZhen",
    "prodMoney" : 45.0,
    "freight" : 13.0,
    "discounts" : 3.0,
    "orderDate" : ISODate("2017-10-31T09:27:17.342Z"),
    "prods" : [ 
        "可乐", 
        "奶茶"
    ]
}

Bestellung Die Gesamtkosten sind die Kosten für das Produkt plus Versand. Die Abfrage lautet wie folgt:

db.sang_collect.aggregate({$project:{totalMoney:{$add:["$prodMoney","$freight"]}}})

Die tatsächlichen Zahlungskosten sind die Gesamtkosten abzüglich des Rabatts, wie folgt:

db.sang_collect.aggregate({$project:{totalPay:{$subtract:[{$add:["$prodMoney","$freight"]},"$discounts"]}}})

Lassen Sie uns drei weitere unsinnige Berechnungen durchführen, wie z. B. Berechnen Sie das Produkt aus prodMoney, Fracht und Rabatten:

db.sang_collect.aggregate({$project:{test1:{$multiply:["$prodMoney","$freight","$discounts"]}}})

Ein weiteres Beispiel besteht darin, den Quotienten aus $prodMoney und $freight zu ermitteln, as folgt:

db.sang_collect.aggregate({$project:{test1:{$pide:["$prodMoney","$freight"]}}})

Ein weiteres Beispiel ist die Verwendung von $freight zum Modulieren von $prodMoney wie folgt:

db.sang_collect.aggregate({$project:{test1:{$mod:["$prodMoney","$freight"]}}})

Sowohl die Addition als auch die Multiplikation können mehrere Parameter erhalten, und der Rest erhält zwei Parameter .

Datumsausdruck

Datumsausdruck kann Jahr, Monat, Tag, Woche, Stunde, Minute, Sekunde und andere Informationen aus einem Datumstyp wie folgt extrahieren:

db.sang_collect.aggregate({$project:{"年份":{$year:"$orderDate"},"月份":{$month:"$orderDate"},"一年中第几周":{$week:"$orderDate"},"日期":{$dayOfMonth:"$orderDate"},"星期":{$dayOfWeek:"$orderDate"},"一年中第几天":{$dayOfYear:"$orderDate"},"时":{$hour:"$orderDate"},"分":{$minute:"$orderDate"},"秒":{$second:"$orderDate"},"毫秒":{$millisecond:"$orderDate"},"自定义格式化时间":{$dateToString:{format:"%Y年%m月%d %H:%M:%S",date:"$orderDate"}}}})

Die Ausführungsergebnisse sind wie folgt:

{
    "_id" : ObjectId("59f841f5b998d8acc7d08861"),
    "年份" : 2017,
    "月份" : 10,
    "一年中第几周" : 44,
    "日期" : 31,
    "星期" : 3,
    "一年中第几天" : 304,
    "时" : 9,
    "分" : 27,
    "秒" : 17,
    "毫秒" : 342,
    "自定义格式化时间" : "2017年10月31 09:27:17"
}

$dayOfWeek gibt die Woche zurück, 1 bedeutet Sonntag, 7 bedeutet Samstag, $week bedeutet, dass diese Woche die Woche des Jahres ist, beginnend bei 0. $dateToString ist eine Funktion in MongoDB3.0+. Außerdem gibt es folgende Formatierungszeichen:

字符 含义 取值范围
%Y Year (4 digits, zero padded) 0000-9999
%m Month (2 digits, zero padded) 01-12
%d Day of Month (2 digits, zero padded) 01-31
%H Hour (2 digits, zero padded, 24-hour clock) 00-23
%M Minute (2 digits, zero padded) 00-59
%S Second (2 digits, zero padded) 00-60
%L Millisecond (3 digits, zero padded) 000-999
%j Day of year (3 digits, zero padded) 001-366
%w Day of week (1-Sunday, 7-Saturday) 1-7
%U Week of year (2 digits, zero padded) 00-53

字符串表达式

字符串表达式中有字符串的截取、拼接、转大写、转小写等操作,比如我截取orderAddressL前两个字符返回,如下:

db.sang_collect.aggregate({$project:{addr:{$substr:["$orderAddressL",0,2]}}})

再比如我将orderAddressL和orderDate拼接后返回:

db.sang_collect.aggregate({$project:{addr:{$concat:["$orderAddressL",{$dateToString:{format:"--%Y年%m月%d",date:"$orderDate"}}]}}})

结果如下:

{
    "_id" : ObjectId("59f841f5b998d8acc7d08861"),
    "addr" : "NanJing--2017年10月31"
}

再比如我将orderAddressL全部转为小写返回:

db.sang_collect.aggregate({$project:{addr:{$toLower:"$orderAddressL"}}})

再比如我将orderAddressL全部转为大写返回:

db.sang_collect.aggregate({$project:{addr:{$toUpper:"$orderAddressL"}}})

逻辑表达式

想要比较两个数字的大小,可以使用$cmp操作符,如下:

db.sang_collect.aggregate({$project:{test:{$cmp:["$freight","$discounts"]}}})

如果第一个参数大于第二个参数返回正数,第一个参数小于第二个则返回负数,也可以利用$strcasecmp来比较字符串(中文无效):

db.sang_collect.aggregate({$project:{test:{$strcasecmp:[{$dateToString:{format:"..%Y年%m月%d",date:"$orderDate"}},"$orderAddressL"]}}})

至于我们之前介绍的$eq/$ne/$gt/$gte/$lt/$lte等操作符在这里一样是适用的。另外还有$and、$or、$not等表达式可用,以$and为例,如下:

db.sang_collect.aggregate({$project:{test:{$and:[{"$eq":["$freight","$prodMoney"]},{"$eq":["$freight","$discounts"]}]}}})

$and中的每个参数都为true时返回true,$or则表示参数中有一个为true就返回true,$not则会对它的参数的值取反,如下:

db.sang_collect.aggregate({$project:{test:{$not:{"$eq":["$freight","$prodMoney"]}}}})

另外还有两个流程控制语句,如下:

db.sang_collect.aggregate({$project:{test:{$cond:[false,"trueExpr","falseExpr"]}}})

$cond第一个参数如果为true,则返回trueExpr,否则返回falseExpr.

db.sang_collect.aggregate({$project:{test:{$ifNull:[null,"replacementExpr"]}}})

$ifNull第一个参数如果为null,则返回replacementExpr,否则就返回第一个参数。

以上内容就是MongoDB管道操作符部分介绍,希望能帮助到大家。

MongoDB固定集合详解

node.js操作MongoDB的代码案例分享

phpstudy如何扩展MongoDB

Das obige ist der detaillierte Inhalt vonMongoDB-Pipeline-Betreiber. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn