MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBの単一の集計クエリでソートとグループ化を同時に行う方法

MongoDBで1つのクエリ内にソート(並べ替え)とグループ化を実現したい場合は、集計フレームワーク(Aggregation Framework)$group 演算子を使用します。この記事では、実際のサンプルコードを使いながら、その手順をわかりやすく解説します。

サンプルコレクションの作成

まず、ドキュメントを含むコレクションを作成しましょう。以下では sortAndGroupDemo というコレクションに、価格(Price)と製品番号(Product)を持つドキュメントを順番に挿入していきます。

> db.sortAndGroupDemo.insertOne({
    Price :40,
    Product: 10
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce8f2bc78f00858fb12e907")
}
> db.sortAndGroupDemo.insertOne({
    Price :100,
    Product: 10
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce8f2bc78f00858fb12e908")
}
> db.sortAndGroupDemo.insertOne({
    Price :90,
    Product: 20
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce8f2bc78f00858fb12e909")
}
> db.sortAndGroupDemo.insertOne({
    Price :200,
    Product: 10
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce8f2bc78f00858fb12e90a")
}
> db.sortAndGroupDemo.insertOne({
    Price :70,
    Product: 20
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce8f2bc78f00858fb12e90b")
}
> db.sortAndGroupDemo.insertOne({
    Price :70,
    Product: 30
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ce8f2bd78f00858fb12e90c")
}

登録した全ドキュメントの確認

find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。

> db.sortAndGroupDemo.find().pretty();

実行すると、次のような出力が得られます。

{
    "_id" : ObjectId("5ce8f2bc78f00858fb12e907"),
    "Price" : 40,
    "Product" : 10
}
{
    "_id" : ObjectId("5ce8f2bc78f00858fb12e908"),
    "Price" : 100,
    "Product" : 10
}
{
    "_id" : ObjectId("5ce8f2bc78f00858fb12e909"),
    "Price" : 90,
    "Product" : 20
}
{
    "_id" : ObjectId("5ce8f2bc78f00858fb12e90a"),
    "Price" : 200,
    "Product" : 10
}
{
    "_id" : ObjectId("5ce8f2bc78f00858fb12e90b"),
    "Price" : 70,
    "Product" : 20
}
{
    "_id" : ObjectId("5ce8f2bd78f00858fb12e90c"),
    "Price" : 70,
    "Product" : 30
}

集計クエリでソートとグループ化を組み合わせる

それでは本題です。MongoDBの集計パイプラインを使えば、$group によるグループ化と $sort による並べ替えを1つのクエリで実行できます。さらに $project を組み合わせることで、出力するフィールドを絞り込むことも可能です。

> db.sortAndGroupDemo.aggregate(
    [
       { "$group": { "_id": "$Product" }},
       { "$sort" : { "Price": 1 }},
       { "$project":{"_id":1 }}
    ]
);

このクエリの処理の流れは以下の通りです。

  • $group: 「Product」フィールドの値ごとにドキュメントをグループ化します。
  • $sort: 結果を「Price」フィールドの昇順(1)で並べ替えます。
  • $project: 出力には「_id」のみを含めます。

実行すると、次のような結果が出力されます。

{ "_id" : 30 }
{ "_id" : 20 }
{ "_id" : 10 }

このように、集計パイプラインの各ステージを組み合わせることで、グループ化・ソート・フィールドの選択といった複数の操作を、たった1つのクエリで効率的に処理できます。大量データを扱う場合にも、サーバー側でまとめて処理されるためパフォーマンス面でも有利です。

  1. MongoDBで_idを使ってグループ化するクエリの書き方

    MongoDBでドキュメントをグループ化するには、集計パイプライン(aggregation pipeline)の $group ステージを使用します。この記事では、実際にコレクションを作成し、$group を使ってデータを集計する手順を具体的な例とともに解説します。 サンプルコレクションの作成 まずは、動作確認用のコレクションにドキュメントを挿入してみましょう。以下のように insertOne() メソッドを使って、スコア情報を持つドキュメントを複数件登録します。 > db.demo529.insertOne({Score:10}); { acknowledged : true

  2. MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説

    MongoDBの集約と投影とはMongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを含むコレクションを作成します。> db