2016-08-31 16 views
1

Mongoに次のドキュメントがあります。指定したIDを持つオブジェクトを取得しようとしています。ここに私のMongoの文書があります。 Mongoのバージョン:2.6MongoDBのネストされた配列から照会されたオブジェクトのみを取得します。

{ 
    "_id" : ObjectId("57c1ae9ac1bd31d4eb4d546d"), 
    "footers" : [ 
     { 
      "type" : "web", 
      "rows" : [ 
       { 
        "id" : "abc", 
        "elements" : [ 
         { 
          "id" : "def", 
          "type" : "image", 
          "url" : "http://example.com" 
         }, 
         { 
          "id" : "ghi", 
          "type" : "image", 
          "url" : "http://example.com" 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

私は「DEF」idを持つオブジェクトを探しています、と私はこの結果を得るためにしたい:

{ 
    "id" : "def", 
    "type" : "image", 
    "url" : "http://example.com" 
} 

私は、私が試したコードの例を挙げて下このオブジェクトの検索を行います。

db.getCollection('myCollection').aggregate([ 
    {"$match": { 
     "footers.rows.elements.id": "def" 
    }}, 
    {"$group": { 
     "_id": "$footers.rows.elements" 
    }} 
]) 

、結果は次のとおりです。

{ 
    "_id" : [ 
     [ 
      [ 
       { 
        "id" : "def", 
        "type" : "image", 
        "url" : "http://example.com" 
       }, 
       { 
        "id" : "ghi", 
        "type" : "image", 
        "url" : "http://example.com" 
       } 
      ] 
     ] 
    ] 
} 

任意の提案ですか?

答えて

2

"$unwind"を使用する必要があります。

詳細Mongodb unwind nested documentshttps://stackoverflow.com/a/12241733/224743これはMongoDBの中で動作するはず指定2.2以降)あなたの具体的な例

をお届けします。この答えは、あなたが何かを行うことができます:

db.getCollection('myCollection').aggregate([ 
    {"$match" : { "footers.rows.elements.id": "def" }}, 
    {"$unwind" : "$footers"}, 
    {"$unwind" : "$footers.rows"}, 
    {"$unwind" : "$footers.rows.elements"}, 
    {"$group" : { "_id": "$footers.rows.elements" }}, 
    {"$match" : { "_id.id": "def" }} 
]); 

お知らせ複数の」 $ unwind "連鎖と、$ unwind-ed文書の条件を再適用するために必要な最後の" $ match "も含まれています。

+1

ありがとうございます。非常に役立ちます。 –

関連する問題