2016-04-29 64 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 } ] } 

我想這樣做產生的查詢,只是SUBDOCS匹配查詢,比如,其中value === 2

我嘗試這樣做:

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

這就是接近,但它只是發現(在本例中的數據),這兩個上級的文件,因爲它們的子元素相匹配。我知道我可以挑選出從結果子文檔,但我想查詢做的工作,併產生這個...

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

...匹配即只是SUBDOCS。可能嗎?提前致謝。

+1

[只檢索查詢的元素可能重複的對象數組在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} } 
    ] 
) 

結果是

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

如果你想刪除重複的做最後的$組

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 } }