MongoDB-集約

集計操作はデータレコードを処理し、計算結果を返します。集計操作は、複数のドキュメントの値をグループ化し、グループ化されたデータに対してさまざまな操作を実行して、単一の結果を返すことができます。SQLのcount(*)およびgroup byは、MongoDB集約と同等です。

Aggregate()メソッド

MongoDBでの集計には、次を使用する必要があります aggregate() 方法。

構文

の基本構文 aggregate() 方法は次のとおりです-

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

コレクションには、次のデータがあります-

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   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}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>

上記のユースケースのSQLと同等のクエリは次のようになります select by_user, count(*) from mycol group by by_user

上記の例では、ドキュメントをフィールドごとにグループ化しています by_userまた、ユーザーが発生するたびに、以前の合計値が増分されます。以下は、使用可能な集計式のリストです。

説明
$ 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 グループ化に従って、ソースドキュメントから最初のドキュメントを取得します。通常、これは、以前に適用された「$ sort」ステージと一緒にのみ意味があります。 db.mycol.aggregate([{$ group:{_ id: "$ by_user"、first_url:{$ first: "$ url"}}}])
$ last グループ化に従って、ソースドキュメントから最後のドキュメントを取得します。通常、これは、以前に適用された「$ sort」ステージと一緒にのみ意味があります。 db.mycol.aggregate([{$ group:{_ id: "$ by_user"、last_url:{$ last: "$ url"}}}])

パイプラインの概念

UNIXコマンドでは、シェルパイプラインとは、ある入力に対して操作を実行し、その出力を次のコマンドの入力として使用する可能性を意味します。MongoDBは、集約フレームワークでも同じ概念をサポートしています。可能なステージのセットがあり、それらのそれぞれが入力としてドキュメントのセットとして取得され、結果のドキュメントのセット(またはパイプラインの最後で最終的に結果のJSONドキュメント)を生成します。これは、次のステージなどに使用できます。

以下は、集約フレームワークで可能な段階です。

  • $project −コレクションから特定のフィールドを選択するために使用されます。

  • $match −これはフィルタリング操作であるため、次のステージへの入力として提供されるドキュメントの量を減らすことができます。

  • $group −これは、上記のように実際の集計を行います。

  • $sort −ドキュメントを並べ替えます。

  • $skip −これにより、指定された量のドキュメントのドキュメントのリストをスキップすることができます。

  • $limit −これにより、現在の位置から始まる指定された数だけ、表示するドキュメントの量が制限されます。

  • $unwind−これは、配列を使用しているドキュメントを巻き戻すために使用されます。配列を使用する場合、データは一種の事前結合されており、この操作はこれで元に戻され、個々のドキュメントが再び作成されます。したがって、この段階では、次の段階のドキュメントの量を増やします。