2016-06-22 10 views
3

私はドキュメントを含むコレクションを持っていますが、各ドキュメントに配列があります。私は、ドキュメントの埋め込み配列の和集合の結果である配列を取得したいと思います。組み込み配列の返り値を返します

これは私のコレクションです:

{ 
    "_id": ObjectId("...."), 
    "filter": "a", 
    "images": [ 
     { 
      "_id": ObjectId("...."), 
      "file": "file_a_1.jpg" 
     }, 
     { 
      "_id": ObjectId("...."), 
      "file": "file_a_2.jpg" 
     } 
    ] 
}, 
{ 
    "_id": ObjectId("...."), 
    "filter": "b", 
    "images": [ 
     { 
      "_id": ObjectId("...."), 
      "file": "file_b_3.jpg" 
     }, 
     { 
      "_id": ObjectId("...."), 
      "file": "file_b_4.jpg" 
     } 
    ] 
}, 
{ 
    "_id": ObjectId("...."), 
    "filter": "a", 
    "images": [ 
     { 
      "_id": ObjectId("...."), 
      "file": "file_a_5.jpg" 
     }, 
     { 
      "_id": ObjectId("...."), 
      "file": "file_a_6.jpg" 
     } 
    ] 
} 

そして、私は、例えばfilter = "a"を持つドキュメントの埋め込まれた配列を取得したいと思います。

{ 
    "_id": ObjectId("...."), 
    "file": "file_a_1.jpg" 
}, 
{ 
    "_id": ObjectId("...."), 
    "file": "file_a_2.jpg" 
}, 
{ 
    "_id": ObjectId("...."), 
    "file": "file_a_5.jpg" 
}, 
{ 
    "_id": ObjectId("...."), 
    "file": "file_a_6.jpg" 
} 

そして私は、返される配列のサイズとオフセットを制限できるようにしたいと思います。

+0

これを達成するためのクエリを試しましたか? – Shrabanee

答えて

1

このような配列を巻き戻してから、新しいドキュメントシェイプを取得する必要があります。

db.david1.aggregate([{ 
      $match : { 
       "filter" : "a" 
      } 
     }, { 
      $unwind : "$images" 
     }, { 
      $project : { 
       _id : "$images._id", 
       file : "$images.file" 
      } 
     }, { 
      $skip : 2 
     }, { 
      $limit : 1 
     } 
    ]).toArray() 
+0

すべての画像フィールドを自動的に投影する方法はありますか?私の実際のコレクションにはさらに多くのフィールドがあります。 –

+0

いいえ、これは手作業ですが、この段階をスキップできます。プロジェクトを削除して見てください – profesor79

関連する問題