MongoDBでネストされた配列を含むドキュメントを検索し、結果を再形成する方法
MongoDBでは、$unwindや$matchといった集計パイプライン(アグリゲーションフレームワーク)の演算子を組み合わせることで、ネストされた配列(サブドキュメントの配列)を含むドキュメントを検索し、出力結果を自由に再形成できます。この記事では、値を持つオブジェクトと空のオブジェクトが混在する配列から、特定のフィールドが存在する要素だけを抽出する手順を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。
> db.demo187.insertOne(
... {
... "_id" : "101",
... "Details" : [
... { "Subject" : "MongoDB" },
... { "Subject" : "MySQL" }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo187.insertOne(
... {
... "_id" : "102",
... "Details" : [
... { }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : "102" }
> db.demo187.insertOne(
... {
... "_id" : "103",
... "Details" : [
... { "Subject" : "MongoDB" },
... { "Subject" : "MySQL" }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : "103" }
ここで注目すべきは、_id: "102" のドキュメントです。「Details」配列の中に空のオブジェクトが入っており、後ほどこのドキュメントを検索結果から除外できることを確認します。
2. コレクション内の全ドキュメントを確認する
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo187.find();
実行すると、次のような出力が得られます。
{ "_id" : "101", "Details" : [ { "Subject" : "MongoDB" }, { "Subject" : "MySQL" } ] }
{ "_id" : "102", "Details" : [ { } ] }
{ "_id" : "103", "Details" : [ { "Subject" : "MongoDB" }, { "Subject" : "MySQL" } ] }
3. 値が入ったネストされた配列を検索し、結果を再形成するクエリ
以下は、「Subject」フィールドが実際に設定されているネストされた配列を持つドキュメントだけを検索し、結果をフラットな形に再形成するための集計クエリです。
> db.demo187.aggregate([
...
... {$unwind: '$Details'},
...
... {$project: {Subject: '$Details.Subject'}},
...
... {$match: {Subject: {$exists: true}}}
... ])
各ステージの役割は次のとおりです。
- $unwind: 「Details」配列を分解し、配列の各要素を個別のドキュメントとして扱えるようにします。
- $project: ネストされた「Details.Subject」フィールドを取り出し、「Subject」という名前で出力するよう整形します。
- $match: 「Subject」フィールドが存在するドキュメントのみを残し、空のオブジェクトを含むドキュメント(_id: "102")を除外します。
このクエリを実行すると、次のような出力が得られます。
{ "_id" : "101", "Subject" : "MongoDB" }
{ "_id" : "101", "Subject" : "MySQL" }
{ "_id" : "103", "Subject" : "MongoDB" }
{ "_id" : "103", "Subject" : "MySQL" }
まとめ
$unwindで配列を展開し、$projectで必要なフィールドを整形し、$matchで条件に合うドキュメントを絞り込むことで、ネストされた配列を持つMongoDBドキュメントを効率的に検索・再形成できます。空のオブジェクトが自動的に除外されるため、データクレンジングの観点でも非常に有用なテクニックです。
-
特定のFirstNameとLastNameを持つドキュメントを検索するMongoDBクエリの書き方
はじめにMongoDBで特定のFirstNameとLastNameを持つドキュメントを検索するには、$and演算子と$in演算子を組み合わせて使用します。この記事では、実際のコード例を通して、find()メソッドでこの条件を実装する方法を解説します。サンプルコレクションの作成まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成しましょう。> db.demo692.insertOne({FirstName:"Chris","LastName":"Brown"}); { "acknowl
-
MongoDBでオブジェクト配列内の特定のネストされたドキュメントをクエリする方法
MongoDBでオブジェクトの配列からネストされたドキュメントを抽出する オブジェクトの配列に格納されたネストされたドキュメントを条件付きで検索したい場合、find()メソッドに$elemMatch演算子を組み合わせることで、指定した条件に一致する要素だけを取り出すことができます。 ここでは、「StudentAge」フィールドを持つ学生情報だけを配列から抽出する例を見ていきましょう。 1. サンプルコレクションの作成 まず、ドキュメントを挿入してコレクションを作成します。このコレクションには、学生情報がオブジェクトの配列として格納されています。 > db.demo763.insertO