MongoDBでサブドキュメントを並べ替え・選択・クエリする方法を解説
MongoDBでサブドキュメントの並べ替え・選択・クエリを行う方法
MongoDBでサブドキュメントを並べ替える(ソートする)には、集計パイプライン(aggregate())の中で$sortステージを使用します。この記事では、実際にコレクションを作成し、$unwind・$project・$sortを組み合わせてサブドキュメントを操作する具体的な手順を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。以下の例では、detailsというサブドキュメント(Name と Age を保持)を持つドキュメントを3件挿入しています。
> db.demo236.insertOne({"details":{"Name":"Chris","Age":21}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e419015f4cebbeaebec514c")
}
> db.demo236.insertOne({"details":{"Name":"David","Age":23}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e41901cf4cebbeaebec514d")
}
> db.demo236.insertOne({"details":{"Name":"Bob","Age":24}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e419023f4cebbeaebec514e")
}2. 登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo236.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e419015f4cebbeaebec514c"), "details" : { "Name" : "Chris", "Age" : 21 } }
{ "_id" : ObjectId("5e41901cf4cebbeaebec514d"), "details" : { "Name" : "David", "Age" : 23 } }
{ "_id" : ObjectId("5e419023f4cebbeaebec514e"), "details" : { "Name" : "Bob", "Age" : 24 } }3. サブドキュメントをソート・選択するクエリ
以下は、MongoDBの集計フレームワークを使って、サブドキュメントを展開し、必要なフィールドだけを選択して、名前(Name)の降順に並べ替えるクエリです。
> db.demo236.aggregate(
... [
... { $unwind: "$details" },
... { $project: {
... Name: '$details.Name',
... Age: '$details.Age'
...
... }},
... { $sort: {Name: -1}}
...]
...);実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e41901cf4cebbeaebec514d"), "Name" : "David", "Age" : 23 }
{ "_id" : ObjectId("5e419015f4cebbeaebec514c"), "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5e419023f4cebbeaebec514e"), "Name" : "Bob", "Age" : 24 }使用した各ステージのポイント
- $unwind:サブドキュメントや配列フィールドを個々のドキュメントに展開します。ここでは
detailsフィールドを展開しています。 - $project:出力に含めるフィールドを選択します。サブドキュメント内の
NameとAgeをトップレベルのフィールドとして取り出すことで、扱いやすい形に整形できます。 - $sort:指定したフィールドを基準にドキュメントを並べ替えます。
-1は降順、1は昇順を意味します。上の例では名前の降順(Z→A)で結果が返されています。
このように、MongoDBの集計パイプラインを活用すれば、ネストされたサブドキュメントの中身を柔軟に整形・選択・並べ替えて取得することができます。条件を絞り込みたい場合は、パイプラインの先頭に $match ステージを追加すると、より効率的に目的のデータを抽出できます。
-
MongoDBのskip()とlimit()を使ってクエリを分割し、5件のドキュメントをスキップする方法
MongoDBでドキュメントをスキップするには、skip()メソッドとlimit()メソッドを組み合わせて使用します。この2つのメソッドは、ページネーション(ページ分割)機能を実装する際に特に役立ちます。ここでは、1ページあたり5件のデータを扱う例をもとに、具体的な使い方を解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成しましょう。 > db.demo633.insertOne({Value:10}); { acknowledged : true, insertedId : ObjectId(5e
-
MongoDBで値を重複なく選択(distinct)してカウントするクエリの書き方
MongoDBでは、アグリゲーションフレームワーク(集計パイプライン)を活用することで、配列内の値を重複なく抽出し、それぞれの出現回数をカウントできます。本記事では、insertOne()でサンプルデータを作成し、$unwindや$groupなどのステージを組み合わせてdistinct(一意)な値を選択・集計する具体的な手順を解説します。1. サンプルコレクションの作成まずは、ドキュメントを挿入してコレクションを作成します。各ドキュメントには「Name」と「Marks」を持つdetails配列が含まれています。> db.demo586.insertOne( ... {detail