MongoDB の集約
MongoDB の集計は主にデータ (統計的平均、合計など) を処理し、計算されたデータ結果を返すために使用されます。 SQL ステートメントの count(*) に似ています。
aggregate()メソッド
MongoDBの集計メソッドはaggregate()を使用します。
構文
aggregate() メソッドの基本的な構文形式は次のとおりです:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
インスタンス
コレクション内のデータは次のとおりです:
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'w3cschool.cc', url: 'http://www.w3cschool.cc', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }, { _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'w3cschool.cc', url: 'http://www.w3cschool.cc', tags: ['mongodb', 'database', 'NoSQL'], likes: 10 }, { _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 },
ここで、上記のコレクション、aggregate( ) を使用した計算結果は次のとおりです:
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "result" : [ { "_id" : "w3cschool.cc", "num_tutorial" : 2 }, { "_id" : "Neo4j", "num_tutorial" : 1 } ], "ok" : 1 } >
上記の例は SQL ステートメントに似ています: select by_user, count(*) from mycol group by by_user
上記の例では、グループ化していますby_user フィールドごとにデータを取得し、by_user フィールドの同じ値の合計を計算します。
次の表は、いくつかの集計式を示しています:
Expression | Description | Instance |
---|---|---|
$sum | 合計を計算します。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 平均を計算します | db 。 mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 内のすべてのドキュメントの対応する最小値を取得します。コレクション。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | すべてのドキュメントの対応関係を取得コレクションの中で最大限の価値があります。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 結果ドキュメントを配列に格納します。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | に値を挿入します結果ドキュメントを配列に格納しますが、コピーは作成されません。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | のソートに従って取得リソースドキュメント 最初のドキュメントデータ。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | のソートに従って取得リソースドキュメント 最後のドキュメントデータ | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
パイプの概念
パイプラインは通常、Unix と Linux で現在のコマンドの出力を次のコマンドのパラメーターとして使用するために使用されます。
MongoDB の集約パイプラインは、1 つのパイプラインが完了した後、MongoDB ドキュメントの結果を次のパイプラインに渡して処理します。パイプライン操作は反復可能です。
式: 入力ドキュメントと出力を処理します。この式はステートレスであり、現在の集計パイプラインのドキュメントを計算するためにのみ使用でき、他のドキュメントを処理することはできません。
ここでは、集約フレームワークで一般的に使用されるいくつかの操作を紹介します:
$project: 入力ドキュメントの構造を変更します。フィールドの名前変更、追加、削除に使用でき、計算結果やネストされたドキュメントの作成にも使用できます。
$match: データをフィルタリングし、条件を満たすドキュメントのみを出力するために使用されます。 $match は、MongoDB の標準クエリ操作を使用します。
$limit: MongoDB 集約パイプラインによって返されるドキュメントの数を制限するために使用されます。
$skip: 集約パイプライン内の指定された数のドキュメントをスキップし、残りのドキュメントを返します。
$unwind: ドキュメント内の配列型フィールドを複数のフィールドに分割し、それぞれに配列内の値が含まれます。
$group: コレクション内のドキュメントをグループ化し、統計結果に使用できます。
$sort: 入力ドキュメントをソートして出力します。
$geoNear: 特定の地理的位置に近い順序付けされたドキュメントを出力します。
パイプライン オペレーター インスタンス
1. $project インスタンス
db.article.aggregate( { $project : { title : 1 , author : 1 , }} );
この場合、結果には _id、tilt、author の 3 つのフィールドのみが含まれます。 _id を含めたくない場合は、次のようにすることができます:
db.article.aggregate( { $project : { _id : 0 , title : 1 , author : 1 }});
2.$match インスタンス
db.articles.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
$match は、スコアが 70 より大きく 90 以下のレコードを取得し、条件を満たすレコードを送信するために使用されます。次のステージへの条件 $group 処理用のパイプライン オペレーター。
3.$skip インスタンス
db.article.aggregate( { $skip : 5 });
$skip パイプライン オペレーターによって処理された後、最初の 5 つのドキュメントが「フィルター」で除外されます。