我沒有貓鼬建立與節點要做到這一點,但你也可以得到你想要使用新的聚合框架的結果在2.2中 - 這是一個能夠讓你得到你想要的結果的例子。首先,我的示例文檔看起來是這樣的:
> db.foo.findOne()
{
"_id" : ObjectId("50472eb566caf6af6108de02"),
"items" : [
1,
2,
3,
45,
4,
67,
9,
4
]
}
要得到你想要我這樣做的:
> db.foo.aggregate(
{$match : {"_id": ObjectId("50472eb566caf6af6108de02")}},
{$unwind : "$items"},
{$match : {"items": {$in : [1, 67, 9]}}},
{$group : {_id : "$_id", items : { $push : "$items"}}},
{$project : {_id : 0, items : 1}}
)
{
"result" : [
{
"_id" : ObjectId("50472eb566caf6af6108de02"),
"items" : [
1,
67,
9
]
}
],
"ok" : 1
}
的講解,詳細我會把它逐行:
{$match : {"_id": ObjectId("50472eb566caf6af6108de02")}}
這非常明顯 - 它基本上等同於普通查詢的查找條件,結果會傳遞到要處理的管道中的下一個步驟。這是一塊可以使用索引等
{$unwind : "$items"}
這會爆炸的陣列,創建文檔的流,一個用於所述陣列中的每個元素。
{$match : {"items": {$in : [1, 67, 9]}}}
這第二場比賽將只返回列表中的文檔,基本上將文檔流減少到三個結果集。
{$group : {_id : "$_id", items : { $push : "$items"}}}
我們希望我們的輸出是一個數組,所以我們上面現在我們已經選擇了我們想要的物品,使用_id爲重點,以組撤消放鬆。注意:這將有重複的值,如果有一個以上的比賽,如果你想你會使用$addToSet
代替$push
{$project : {_id : 1, items : 1}}
於是最後,是不是真的需要這個投影獨特的名單,但我把它列入到說明功能 - 如果您願意,您可以選擇不返回_id。
@esaelPsnoroMoN此功能已添加到2.2中,如問題中給出的鏈接所示。 OP還在標題中引用了2.2版本。 – Thomas
也許在你的findOne()調用中你需要ObjectId(5)而不是Object(5)? – drevicko
MongoDB Node.JS Native Driver中存在同樣的問題 - 您可以在選項$ elemMatch中設置,但驅動程序始終返回所有子文檔。 如果你在mongodb控制檯中測試你的查詢,它的效果很好。 – user1873840