如何使用MongoDB过滤子文档中的数组 [英] How to filter array in subdocument with MongoDB
问题描述
我在子文档中有这样的数组
I have array in subdocument like this
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 1
},
{
"a" : 2
},
{
"a" : 3
},
{
"a" : 4
},
{
"a" : 5
}
]
}
我可以过滤一个> 3的子文档
Can I filter subdocument for a > 3
我的预期结果如下
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 4
},
{
"a" : 5
}
]
}
我尝试使用 $elemMatch
但返回数组中的第一个匹配元素
I try to use $elemMatch
but returns the first matching element in the array
我的查询:
db.test.find( { _id" : ObjectId("512e28984815cbfcb21646a7") }, {
list: {
$elemMatch:
{ a: { $gt:3 }
}
}
} )
结果返回数组中的一个元素
The result return one element in array
{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "list" : [ { "a" : 4 } ] }
我尝试将聚合与 $match
一起使用,但不起作用
and I try to use aggregate with $match
but not work
db.test.aggregate({$match:{_id:ObjectId("512e28984815cbfcb21646a7"), 'list.a':{$gte:5} }})
返回数组中的所有元素
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 1
},
{
"a" : 2
},
{
"a" : 3
},
{
"a" : 4
},
{
"a" : 5
}
]
}
我可以过滤数组中的元素以获得预期结果吗?
Can I filter element in array to get result as expect result?
推荐答案
使用 aggregate
是正确的方法,但您需要 $unwind
list
数组在应用 $match
之前,以便您可以过滤单个元素,然后使用 $group
将其重新组合在一起:
Using aggregate
is the right approach, but you need to $unwind
the list
array before applying the $match
so that you can filter individual elements and then use $group
to put it back together:
db.test.aggregate([
{ $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
{ $unwind: '$list'},
{ $match: {'list.a': {$gt: 3}}},
{ $group: {_id: '$_id', list: {$push: '$list.a'}}}
])
输出:
{
"result": [
{
"_id": ObjectId("512e28984815cbfcb21646a7"),
"list": [
4,
5
]
}
],
"ok": 1
}
MongoDB 3.2 更新
从 3.2 版本开始,您可以使用新的 $filter
聚合运算符通过在 $project
中仅包含您想要的 list
元素来更有效地执行此操作:
Starting with the 3.2 release, you can use the new $filter
aggregation operator to do this more efficiently by only including the list
elements you want during a $project
:
db.test.aggregate([
{ $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
{ $project: {
list: {$filter: {
input: '$list',
as: 'item',
cond: {$gt: ['$$item.a', 3]}
}}
}}
])
这篇关于如何使用MongoDB过滤子文档中的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!