例如,有一个名为test
的集合,其中包含以下文档:
{
"_id" : ObjectId("5692ac4562c824cc5167379f"),
"list" : [
{
"name" : "elem1",
"type" : 1
},
{
"name" : "elem2",
"type" : 2
},
{
"name" : "elem3",
"type" : 1
},
{
"name" : "elem4",
"type" : 3
},
{
"name" : "elem4",
"type" : 2
}
]
}
我想说我想在list
内检索匹配的仅那些子文档的列表:
type = 2
。我已尝试过以下查询:
db.getCollection('test').find({
'_id': ObjectId("5692ac4562c824cc5167379f"),
'list.type': 1
})
但是我得到的结果包含 list
内的每个子文档,我猜这是因为在list
内至少有一个文档的类型< em>等于 1。
而不是那个,我有兴趣获得的结果是匹配list
的'list.type': 1
内的每个子文档:
{
"_id" : ObjectId("5692ac4562c824cc5167379f"),
"list" : [
{
"name" : "elem1",
"type" : 1
},
{
"name" : "elem3",
"type" : 1
}
]
}
...所以$
和$elemMatch
不是我真正想要的,因为它们只返回第一个匹配元素。
任何人都知道如何实现我的目标?
答案 0 :(得分:0)
db.myCol.aggregate([
{ $unwind: "$list" },
{ $match: { "list.type":1 } },
{ $group: { "_id":"$_id", list: {$push:"$list"}} }
])