2017-12-10 15 views
0

こんにちは、私はMongoDBでいくつかのネストされた文書を照会しようとしています。私は唯一の募集Mongooseサブ文書を照会

ObjectSchema.find({ 
     'photos': { 
      $elemMatch : { 
       'text' : 'good' 
      } 
     } 
    },function(err,result){ 
     console.log(result); 
    }); 

:イムマングースを使用して...私の文書は、私はテキスト属性で、「良い」の値を持っているだけの写真を見つけたい

[ 
{ 
    "_id": "5a2ca2227c42ad67682731d4", 
    "description": "some descrition", 
    "photos": [ 
     { 
      "_id": "5a2ca22b7c42ad67682731d5", 
      "approved": false, 
      "text":"good" 
     }, 
     { 
      "_id": "5a2ca72b0a1aa173aaae07da", 
      "approved": true, 
      "text":"bad" 
     }, 
     { 
      "_id": "5a2cabf85a41077a2f87d4e3",  
      "approved": false, 
      "text":"bad" 
     } 
    ] 
} 
] 

のようなもので、ここに私のfindコードです私のクエリと一致する値を持つ要素を持つオブジェクトを返すが、このリストの1つのオブジェクトが一致すると、そのテキストに一致するだけでなく、結果の写真がすべて一覧に表示されます。 どのようにクエリを実行し、この例では、テキストに「良い」要素がある要素のみが一致する要素のみが表示されます。

im using nodejs + mongoose

ありがとうございます!

+0

[MongoDBのコレクション内のオブジェクトの配列でのみ照会要素を取得し(https://stackoverflow.com/questionsの可能な重複/ 3985214 /照会のみの照会対象の要素配列内のmongodbコレクション) – Veeram

答えて

1

findは条件付きで使用されており、文書全体が返されます。 specify a projection with findを使用して、ドキュメントの特定のフィールドを含める/除外することもできます。

ObjectSchema.find({ 
    'photos': { 
     $elemMatch : { 
      'text' : 'good' 
     } 
    } 
}, { 
    'photos': { 
     $elemMatch : { 
      'text' : 'good' 
     } 
    } 
}, function(err,result){ 
    console.log(result); 
}); 

をしかし$elemMatch in the projection will only include the first matching array elementことを注意してください:あなたは、次のように投影して$ elemMatchを使用することができます。おそらく、サンプル文書に基づいてあなたが望むものではありません。代わりにAggregation Frameworkを使用できます。あなたは、次の(未テスト)のようなものから始めて、あなたが好むような出力を整形することができます。

$unwindは、配列の各要素に対して別々のドキュメントを作る
ObjectSchema.aggregate(
    {$unwind: "$photos"}, 
    {$match: {"photos.text": "good"}}, 
    function(err,result){ 
     console.log(result); 
    } 
) 

コメントに記載されているように出力をシェイプするには、$group aggregationを使用する必要があります。パイプラインの最後に、次のような$基凝集を追加してみてください:

{$group: {_id: "$_id", photos: {$push: "$photos"}}} 
+0

これは機能します!しかし、すべての試合、1つのドキュメントを返す.. [{_id 1、photos [すべての一致]}、{_ id 2、photos [すべての一致]}]のような結果を作ることは可能ですか? –

+0

ありがとう!できます!! –

関連する問題