Maison  >  Article  >  développement back-end  >  Opérateurs de pipelines MongoDB

Opérateurs de pipelines MongoDB

小云云
小云云original
2017-12-06 14:09:182142parcourir

Les amis qui connaissent le système d'exploitation Linux doivent savoir qu'il existe des canaux sous Linux, qui peuvent être utilisés pour traiter facilement les données. MongoDB version 2.2 introduit également un nouveau cadre d'agrégation de données. Un document peut passer par un pipeline composé de plusieurs nœuds. Chaque nœud a ses propres fonctions spéciales, telles que le regroupement de documents, le filtrage de documents, etc. , effectuez une conversion de type sur ces documents, puis transmettez les documents convertis au nœud suivant, et le dernier nœud renverra les résultats au client. Dans cet article, nous examinerons d’abord quelques opérateurs de pipelines de base.

$match

$match peut être utilisé pour filtrer les documents Une fois le filtrage terminé, nous pouvons filtrer les Let's obtenus. faire l'agrégation des données sur le sous-ensemble de documents. Les opérateurs de requête que nous avons introduits précédemment peuvent être utilisés dans $match. Par exemple, obtenez tous les documents dont l'auteur est "Du Fu" dans la collection, comme suit :

db.sang_collect.aggregate({$match:{author:"杜甫"}})
En utilisation réelle, il est préférable de placer $match devant le pipeline, ce qui peut réduire la charge de travail du pipeline suivant. En même temps, nous pouvons également utiliser l'index lors de l'exécution de $match avant la projection et le regroupement.

$project

Utilisation de base

$project peut être utilisé pour extraire le champ souhaité, de la manière suivante :

db.sang_collect.aggregate({$project:{title:1,_id:0}})
1 signifie que le champ est obligatoire, 0 signifie que le champ n'est pas nécessaire. Vous pouvez également renommer le champ renvoyé, par exemple en changeant le titre en titre de l'article, comme suit :

db.sang_collect.aggregate({$project:{"articleTitle":"$title"}})
Cependant, il y a un problème qui doit être noté. . S'il y a un index sur le champ d'origine, renommez-le. Il n'y a pas d'index sur le champ après son nom, il est donc préférable d'utiliser un index avant de le renommer.

Expressions mathématiques

Les expressions mathématiques peuvent être utilisées pour ajouter, soustraire, multiplier et diviser un ensemble de valeurs modulo. Par exemple, ma structure de données est la suivante :

<.>

Commande Le coût total est le coût du produit plus les frais d'expédition. La requête est la suivante :
{
    "_id" : ObjectId("59f841f5b998d8acc7d08863"),
    "orderAddressL" : "ShenZhen",
    "prodMoney" : 45.0,
    "freight" : 13.0,
    "discounts" : 3.0,
    "orderDate" : ISODate("2017-10-31T09:27:17.342Z"),
    "prods" : [ 
        "可乐", 
        "奶茶"
    ]
}

Le coût réel du paiement est le coût total moins la remise, comme suit :
db.sang_collect.aggregate({$project:{totalMoney:{$add:["$prodMoney","$freight"]}}})

Faisons trois autres calculs absurdes, tels que Calculer le produit de prodMoney, de fret et de remises :
db.sang_collect.aggregate({$project:{totalPay:{$subtract:[{$add:["$prodMoney","$freight"]},"$discounts"]}}})

Un autre exemple consiste à trouver le quotient de $prodMoney et $freight, comme suit :
db.sang_collect.aggregate({$project:{test1:{$multiply:["$prodMoney","$freight","$discounts"]}}})

Un autre exemple consiste à utiliser $freight pour modulo $prodMoney , comme suit :
db.sang_collect.aggregate({$project:{test1:{$pide:["$prodMoney","$freight"]}}})

L'addition et la multiplication peuvent recevoir plusieurs paramètres, et les autres en reçoivent tous deux. paramètres.
db.sang_collect.aggregate({$project:{test1:{$mod:["$prodMoney","$freight"]}}})

Expression de date

L'expression de date peut extraire l'année, le mois, le jour, la semaine, l'heure, la minute, la seconde et d'autres informations à partir d'un type de date, comme suit :

Les résultats d'exécution sont les suivants :
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"}}}})

$dayOfWeek renvoie la semaine, 1 signifie dimanche, 7 signifie samedi, $week signifie que cette semaine est la semaine de l'année, en comptant à partir de 0. $dateToString est une fonctionnalité de MongoDB3.0+. Il existe également les caractères de formatage suivants :
{
    "_id" : ObjectId("59f841f5b998d8acc7d08861"),
    "年份" : 2017,
    "月份" : 10,
    "一年中第几周" : 44,
    "日期" : 31,
    "星期" : 3,
    "一年中第几天" : 304,
    "时" : 9,
    "分" : 27,
    "秒" : 17,
    "毫秒" : 342,
    "自定义格式化时间" : "2017年10月31 09:27:17"
}

字符串表达式

字符串表达式中有字符串的截取、拼接、转大写、转小写等操作,比如我截取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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn