2016-04-29 5 views
-1

サブ文書の基準に基づいて文書を検索する方法について多くの質問がありますが、文書が含まれている文書ではなく、サブ文書自体を取り出すことは可能ですか?mongoでサブ文書を検索する

注 - 提案された複製は複製ではありません。そのOPはコレクション内の文書を返す方法を尋ねる。各文書は、一致するサブ文書のサブセットを持つ。私の質問は、サブ文書だけ一致する一致するを取得する方法です。このようなコレクションから

{ name:"a" subs: [ { subname:"aa", value: 1 }, { subname:"ab", value: 2 } ] } 
{ name:"b" subs: [ { subname:"ba", value: 2 }, { subname:"bb", value: 3 } ] } 

私は、クエリ、たとえば、value === 2をマッチングsubdocs、生成クエリを実行したいと思います。そのサブ要素が一致しているので、両方の上位文書を

myCollection.find().elemMatch("subs", { value:2 }) 

そして、それは近いですが、それだけで(例えば、データに)見つかった:

は、私はこれを試してみました。私は...私は結果からサブ文書を選び出すことができますが、私は仕事をするために、クエリを希望し、これを作ると一致

{ subname:"ab", value: 2 } 
{ subname:"ba", value: 2 } 

...つまりただsubdocsを知っています。出来ますか?前もって感謝します。

+1

可能な重複になります

{ "subs" : { "subname" : "ab", "value" : 2 } } { "subs" : { "subname" : "ba", "value" : 2 } } { "subs" : { "subname" : "ab", "value" : 2 } } { "subs" : { "subname" : "acc", "value" : 2 } } 

ですMongoDBコレクションの配列](http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array-in-mongodb-collection) – styvane

答えて

1

一つのオプションは以下の使用集約fwk可能性は

を使用して

db.foo.insert({ name:"a", subs : [ { subname:"aa", value: 1 }, { subname:"ab", value: 2 } ] }) 
db.foo.insert({ name:"b" , subs: [ { subname:"ba", value: 2 }, { subname:"bb", value: 3 } ] }) 
db.foo.insert({ name:"c", subs : [ { subname:"aa", value: 1 }, { subname:"ab", value: 2 }, { subname:"acc", value: 2 } ] }) 

私の例です

db.foo.aggregate(
[ 
    { $unwind : "$subs" }, 
    { $match : { "subs.value": 2 }}, 
    { $project : {"subs" : 1 , "_id" : 0} } 
    ] 
) 

結果を削除したい場合は、重複最終$グループを行う

db.foo.aggregate(
[ 
    { $unwind : "$subs" }, 
    { $match : { "subs.value": 2 }}, 
    { $group : { "_id": { "subname" : "$subs.subname" , "value" : "$subs.value" }}}, 
    { $project : { "subs" : "$_id" , "_id" : 0}} 
    ] 
) 

結果は、[オブジェクトにのみ照会要素を取得する

{ "subs" : { "subname" : "acc", "value" : 2 } } 
{ "subs" : { "subname" : "ba", "value" : 2 } } 
{ "subs" : { "subname" : "ab", "value" : 2 } } 
関連する問題