MongoDBで配列内の複数の要素を取得するクエリの書き方
MongoDBでドキュメント内の配列から複数の要素を取得したい場合は、アグリゲーションフレームワークを使用するのが効果的です。この記事では、実際にコレクションを作成しながら、配列内の複数アイテムを抽出するクエリの書き方を順を追って解説します。
1. サンプルデータの作成
まずは、ユーザー情報を配列として持つドキュメントを含むコレクションを作成します。insertOne()メソッドを使用して、次のようにデータを挿入します。
> db.retrieveMultipleDemo.insertOne(
... {
... "UserDetails":
... [
... { "_id": "101", "UserName":"John", "UserAge": 23 },
... { "_id": "102", "UserName":"Carol", "UserAge": 21 },
... { "_id": "103", "UserName":"David", "UserAge": 23},
... { "_id": "104", "UserName":"Sam", "UserAge": 25}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd40c85edc6604c74817cf0")
}上記のコレクションでは、「UserDetails」というフィールドに4人のユーザー情報が配列形式で格納されています。
2. 登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。pretty()を組み合わせると、見やすい整形された形式で出力されます。
> db.retrieveMultipleDemo.find().pretty();
実行すると、次のような結果が得られます。
{
"_id" : ObjectId("5cd40c85edc6604c74817cf0"),
"UserDetails" : [
{
"_id" : "101",
"UserName" : "John",
"UserAge" : 23
},
{
"_id" : "102",
"UserName" : "Carol",
"UserAge" : 21
},
{
"_id" : "103",
"UserName" : "David",
"UserAge" : 23
},
{
"_id" : "104",
"UserName" : "Sam",
"UserAge" : 25
}
]
}3. 配列内の複数の要素を取得するアグリゲーションクエリ
それでは本題です。配列の中から条件に合致する複数の要素を取り出すには、aggregate()メソッドでパイプラインを組み立てます。ここでは「年齢が23歳」のユーザーを抽出してみましょう。
> db.retrieveMultipleDemo.aggregate([
... {$unwind:"$UserDetails"},
... {$match:{"UserDetails._id":{$in:myIds},"UserDetails.UserAge":23}},
... {$group:{"_id":"_id","UserDetails":{$push:"$UserDetails"}}},
... {$project:{"_id":0,"UserDetails":1}}
... ]);実行結果は次のとおりです。
{ "UserDetails" : [ { "_id" : "101", "UserName" : "John", "UserAge" : 23 }, { "_id" : "103", "UserName" : "David", "UserAge" : 23 } ] }各ステージの役割
このクエリでは、4つのステージを組み合わせています。それぞれの動きを理解しておくと応用が利きます。
- $unwind: 配列「UserDetails」を分解し、各要素を個別のドキュメントとして扱えるようにします。
- $match: 条件に一致するドキュメントだけを絞り込みます。ここでは_idが指定リスト(myIds)に含まれ、かつUserAgeが23である要素を対象としています。
- $group: 分解されていたドキュメントを元の形に再グループ化し、$push演算子で一致した要素を配列にまとめ直します。
- $project: 出力フィールドを制御します。ここでは_idを非表示にし、UserDetailsのみを出力しています。
このように$unwindで配列を展開し、$matchで絞り込み、$groupで再構成する流れを押さえておけば、MongoDBのネストされた配列から必要な複数の要素を柔軟に取得できるようになります。
-
MongoDBで_idを使ってグループ化するクエリの書き方
MongoDBでドキュメントをグループ化するには、集計パイプライン(aggregation pipeline)の $group ステージを使用します。この記事では、実際にコレクションを作成し、$group を使ってデータを集計する手順を具体的な例とともに解説します。 サンプルコレクションの作成 まずは、動作確認用のコレクションにドキュメントを挿入してみましょう。以下のように insertOne() メソッドを使って、スコア情報を持つドキュメントを複数件登録します。 > db.demo529.insertOne({Score:10}); { acknowledged : true
-
MongoDBでオブジェクトの配列内の複数条件に一致するドキュメントを検索する方法($andと$regex活用)
MongoDBでオブジェクト(サブドキュメント)の配列内から、複数の条件を同時に満たすドキュメントを検索したい場合は、$and演算子と$regex演算子、さらに$elemMatchを組み合わせるのが効果的です。$andは、1つ以上の式からなる配列に対して論理AND演算を実行し、配列内のすべての条件を満たすドキュメントだけを選択します。また、$elemMatchを使うことで、配列内の同一要素が複数条件を満たすかどうかを正確に判定できます。サンプルコレクションの作成まず、検証用のコレクションを作成してドキュメントを挿入してみましょう。> db.demo525.insertOne({detai