ネストされた配列ドキュメントの特定のフィールドのみを取得するMongoDBクエリ
MongoDBでネストされた配列内のドキュメントから特定のフィールドだけを取得したい場合、$projectと$filterを組み合わせて使用します。この記事では、実際のコード例を使って手順をわかりやすく解説します。
サンプルデータの作成
まず、ネストされた構造を持つドキュメントを含むコレクションを作成しましょう。以下の例では、details1の中にdetails2配列、さらにその中にdetails3配列という多層構造のデータを挿入しています。
> db.demo342.insertOne({
... "Id": "101",
... "details1" : {
... "details2" : [
... {
... "details3" : [
... {
... "Name": "Mike",
... "CountryName" : "US"
... },
... {
... "Name": "David",
... "CountryName" : "AUS"
... },
... {
... "Name": "Bob",
... "CountryName" : "UK"
... }
... ]
... }
... ]
... }
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e53ef99f8647eb59e5620a9")
}登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo342.find();
上記のクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e53ef99f8647eb59e5620a9"), "Id" : "101", "details1" : { "details2" : [ { "details3" : [ { "Name" : "Mike", "CountryName" : "US" }, { "Name" : "David", "CountryName" : "AUS" }, { "Name" : "Bob", "CountryName" : "UK" } ] } ] } }現時点では、details3配列内のすべての要素(Mike、David、Bob)が返されていることが確認できます。
特定のフィールドのみを抽出する集計クエリ
ここからが本題です。aggregate()メソッドと$filter演算子を組み合わせることで、条件に一致する要素だけを取り出せます。以下の例では、「Name」が「Bob」であるドキュメントのみを取得しています。
> db.demo342.aggregate([
... { "$project": {
... "details1": {
... "details2": {
... "$filter": {
... "input": {
... "$map": {
... "input": "$details1.details2",
... "in": {
... "details3": {
... "$filter": {
... "input": "$$this.details3",
... "cond": { "$eq": ["$$this.Name", "Bob"] }
... }
... }
... }
... }
... },
... "cond": { "$ne": ["$$this.details3", []] }
... }
... }
... }
... }}
... ])クエリの仕組み
このパイプラインの処理内容を簡単に説明します。
まず、内側の$mapがdetails1.details2配列の各要素を走査し、その中のdetails3配列に対して$filterを適用して「Name」が「Bob」と一致する要素だけを残します。次に、外側の$filterが、details3が空配列になってしまったdetails2の要素を除外しています。これにより、条件に一致しない空の入れ子構造が出力されるのを防げます。
実行結果
上記の集計クエリを実行すると、次の出力が得られます。
{ "_id" : ObjectId("5e53ef99f8647eb59e5620a9"), "details1" : { "details2" : [ { "details3" : [ { "Name" : "Bob", "CountryName" : "UK" } ] } ] } }ご覧のとおり、details3配列には「Name: Bob」の要素のみが含まれており、不要なデータはすべて除外されました。この手法を使えば、深くネストされた配列構造からでも必要な情報だけを効率的に取得できます。条件部分の「Bob」や対象フィールドを変更すれば、さまざまなケースに応用できるので、ぜひ試してみてください。
-
MongoDBでオブジェクト配列内の特定のネストされたドキュメントをクエリする方法
MongoDBでオブジェクトの配列からネストされたドキュメントを抽出する オブジェクトの配列に格納されたネストされたドキュメントを条件付きで検索したい場合、find()メソッドに$elemMatch演算子を組み合わせることで、指定した条件に一致する要素だけを取り出すことができます。 ここでは、「StudentAge」フィールドを持つ学生情報だけを配列から抽出する例を見ていきましょう。 1. サンプルコレクションの作成 まず、ドキュメントを挿入してコレクションを作成します。このコレクションには、学生情報がオブジェクトの配列として格納されています。 > db.demo763.insertO
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "