ホームページ  >  記事  >  バックエンド開発  >  MongoDB パイプライン オペレーター

MongoDB パイプライン オペレーター

小云云
小云云オリジナル
2017-12-06 14:09:182142ブラウズ

Linux オペレーティング システムに詳しい友人は、Linux にはデータを便利に処理するために使用できるパイプラインがあることを知っているはずです。 MongoDB バージョン 2.2 では、新しいデータ集約フレームワークも導入されており、ドキュメントは複数のノードで構成されるパイプラインを通過できます。各ノードには、ドキュメントのグループ化、ドキュメントのフィルタリングなどの独自の機能があります。各ノードは一連のドキュメントを受け入れます。 、これらのドキュメントに対して何らかの型変換を実行し、変換されたドキュメントを次のノードに渡します。最後のノードは結果をクライアントに返します。この記事では、まずいくつかの基本的なパイプライン演算子を見ていきます。

$match

$match を使用してドキュメントをフィルタリングできます。フィルタリングが完了したら、前に紹介したクエリ演算子を使用してドキュメントのサブセットに対してデータ集計操作を実行できます。たとえば、次のように、コレクション内で作成者が「Du Fu」であるすべてのドキュメントを取得します。

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

実際の使用では、$match をパイプラインの前に置くのが最善です。これにより、同時に、プロジェクションとグループ化の前に $match を実行するときにインデックスを使用することもできます。

$project

基本的な使い方

$project は、次のように目的のフィールドを抽出するために使用できます:

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

1 はこのフィールドが必要であることを意味し、0 はこのフィールドが不要であることを意味し、返されたフィールドの名前を変更することもできます

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

ただし、元のフィールドにインデックスがある場合、名前を変更したフィールドにはインデックスが存在しないため、注意が必要な問題があります。名前を変更する前にインデックスを使用することをお勧めします。

数式

数式は、一連の値を加算、減算、乗算、除算して剰余を求めるために使用できます。たとえば、私のデータ構造は次のとおりです。

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

注文の合計コストは次のとおりです。クエリは次のとおりです:

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

実際の支払い手数料は、次のように合計手数料から割引を差し引いたものです:

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

prodMoney と運賃と割引の積を計算するなど、3 つの無意味な操作を実行してみましょう。 :

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

別の例は、次のように $prodMoney と $freight の商を求めることです:

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

別の例は、次のように $freight を使用して $prodMoney を法算することです:

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

加算と乗算の両方で複数のパラメーターを受け取ることができます、残りはすべて 2 つのパラメーターを受け取ります。

日付式

日付式は、次のように日付型から年、月、日、週、時、分、秒などの情報を抽出できます:

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"}}}})

実行結果は次のとおりです:

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

$dayOfWeekが返されますこれは週であり、1 は日曜日を意味し、7 は土曜日を意味し、$week は今週が今年の週であることを意味し、0 から数えます。 $dateToString は MongoDB3.0 以降の機能です。次の書式設定文字もあります:

文字 意味 値の範囲
%Y 年(4桁、ゼロ埋め) 0000-9999
%m 月 (2 桁、ゼロ埋め) 01-12
%d 日 (2 桁、ゼロ埋め) 01-31
%H 時 2 桁、ゼロ埋め) 00-60
%L ミリ秒 (3 桁、ゼロ埋め) 000-999
%j 通算日 (3 桁、ゼロ埋め) 001 -366
%w 曜日 (1-日曜日、7-土曜日) 1-7
%U 年の週 (2 桁、ゼロ埋め込み) 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

以上がMongoDB パイプライン オペレーターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。