MongoDBでサブドキュメントの配列をクエリする方法
MongoDBでサブドキュメントの配列をクエリするには、集計パイプラインの$unwindを使用します。$unwindは、配列フィールドを展開し、配列の各要素ごとに個別のドキュメントを生成するステージです。これにより、配列内のサブドキュメントを個別にフィルタリングできるようになります。
ここでは、大学の情報を含むコレクションを作成し、その中から特定の条件に一致するサブドキュメントを抽出する手順を解説します。
コレクションの作成
まず、insertOne()メソッドを使って、サブドキュメントの配列を含むドキュメントを挿入しましょう。
> db.demo499.insertOne({
... "details":
... [
... {
... Name :"MIT",
... Rank: 1,
... "CountryName":"US"
... },
...
... {
... Name :"Stanford University",
... Rank: 2
... },
...
... {
... Name :"University of California, Berkeley",
... Rank: 3
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e87433d987b6e0e9d18f558")
}このコレクションには、MIT、スタンフォード大学、カリフォルニア大学バークレー校の3つの大学情報が「details」という配列フィールドに格納されています。なお、MITのドキュメントだけが「CountryName」フィールドを持っている点に注目してください。
ドキュメントの表示
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo499.find();
これにより、次のような出力が得られます。
{ "_id" : ObjectId("5e87433d987b6e0e9d18f558"), "details" : [ { "Name" : "MIT", "Rank" : 1,
"CountryName" : "US" }, { "Name" : "Stanford University", "Rank" : 2 }, { "Name" : "University
of California, Berkeley", "Rank" : 3 } ] }サブドキュメントの配列をクエリする
以下は、$unwind、$match、$projectを組み合わせて、サブドキュメントの配列をクエリする例です。
> db.demo499.aggregate({$unwind: "$details"},
... {$match: {"details.CountryName":{$exists: true}}},
... {$project: {"details.Name": 1, "details.CountryName": 1, "_id": 0}})これにより、次のような出力が得られます。
{ "details" : { "Name" : "MIT", "CountryName" : "US" } }各ステージの処理内容
この集計パイプラインは、以下の3つのステージで構成されています。
- $unwind:「details」配列を展開し、各サブドキュメントを個別のドキュメントとして扱えるようにします。
- $match:「details.CountryName」フィールドが存在するドキュメントのみに絞り込みます。この例では、CountryNameを持つMITのデータだけが残ります。
- $project:「details.Name」と「details.CountryName」のみを出力に含め、「_id」フィールドを除外します。
このように、$unwindで配列を展開してから$matchでフィルタリングすることで、配列内のサブドキュメントを柔軟に検索・抽出することができます。
-
MongoDBでネストされた配列を集約する方法:$addFieldsと$mapの活用
MongoDBでネストされた配列を集約するには、aggregate()メソッドを使用します。この記事では、$addFieldsや$mapといった集約パイプラインの演算子を組み合わせて、入れ子構造の配列から特定の条件に合致する要素を抽出する方法を、実際のコード例とともに解説します。サンプルコレクションの作成まず、ネストされた配列を持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使って、ドキュメントを挿入します。> db.demo441.insertOne( ... { ... Name : David, ... Age :
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..