2016-06-20 10 views
0

サブコレクションデータを持つコレクションを作成しました。キーを使ってサブコレクションからフィルタリングしたいここでmondodbのコレクションから子ドキュメントを取得するには?

は私の文書である:私はこのクエリ

db.mycollection.find({"manpower_data.dealerCodeFor":"ZSAE876"});

を実行すると

{ 
    "_id" : ObjectId("5758098356e3930537af15dd"), 
    "manpower_data" : [ 
     { 
      "_id" : ObjectId("5758098356e3930537af15de"), 
      "created" : ISODate("2016-06-08T12:03:15.387Z"),    
      "designation" : "Visiting Evaluator",    
      "evaluatorContactNumber" : "987654321",    
      "evaluatorName" : "Dumy User1", 
      "dealerCodeFor" : "ZSAE876", 
      "region" : "Gurgaon" 
     }, 
     { 
      "_id" : ObjectId("5758098356e3930537af15de"), 
      "created" : ISODate("2016-06-08T12:03:15.387Z"),    
      "designation" : "Resident Evaluator",    
      "evaluatorContactNumber" : "987654321",    
      "evaluatorName" : "Dumy User2", 
      "dealerCodeFor" : "ZSAE877", 
      "region" : "Delhi" 
     } 
    ] 
} 

それは私にすべての二つのサブ文書を戻しますが、私は唯一のdealerCodeForに一致しているものmanpower dataを取得したいです。

答えて

2

配列要素をフィルタリングするには、projectionフェーズ$elemMatchをクエリする必要があります。下の例を参照してください。

db.collection.find({ 
    "manpower_data.dealerCodeFor" : "ZSAE876" 
}, { 
    manpower_data : { 
     $elemMatch : { 
      dealerCodeFor : "ZSAE876" 
     } 
    } 
}) 
+0

から2.6.x未満バージョンについては

、次のクエリを試してみてください。ありがとうございました:) –

+1

注:これは、最初に一致するオブジェクトのみを配列から返します。複数ある場合は、それらをすべて取得することはありません。 – Shrabanee

2

あなたはこれを達成するためにaggregate-mongodb$filterを使用することができます。

次のことを試してください: -

db.collection.aggregate([ 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ 
    "$project": { 
     "manpower_data": { 
      "$filter": { 
       "input": "$manpower_data", 
       "as": "o", 
       "cond": { 
        "$eq": ["$$o.dealerCodeFor", "ZSAE876"] 
       } 
      } 
     } 
    } 
}]) 

上記のクエリを実行することにより、manpower_dataはあなたの条件に一致するオブジェクトのみが返されます。

EDIT: - :それは作品

db.collection.aggregate([ 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ "$unwind": "$manpower_data" }, 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ 
    "$group": { 
     "$_id": "$_id", 
     "manpower_data": { "$push": "$manpower_data" } 
    } 
}]) 
+0

@Shrebaneeは、私が上記のクエリを実行しますが、私は、 'キャッチされない例外がエラー与えた:集計に失敗しました:{ \t "ERRMSG": "例外:無効な演算子 '$フィルタ'"、 \t "コード":15999を、 \t "OK" :0 }「 –

+0

ここに集約する理由は?小さなフライを殺す散弾銃です:-)、 – profesor79

+0

@ profesor79私は、配列内に複数のオブジェクトがある場合、クエリを照合し、それらのオブジェクトをすべて投射することができますと思った。 – Shrabanee

関連する問題