在现代版本的 MongoDB (3.2+) 中,您可以使用$filter
运算符选择要根据指定条件返回的数组字段的子集。返回的元素将按照字段数组中的原始顺序。
mongo
外壳中的示例:
db.items.aggregate([
{ $match : {
_id: 5
}},
{ $project: {
items: {
$filter: {
input: "$items",
cond: {
"$in": ["$$this", [1, 9, 4]]
}
}
}
}
}])
注意:因为这个问题中的原始数组有4
两次值,该$filter
命令将返回两次出现:
{ "_id" : 5, "items" : [ 1, 4, 9, 4 ] }
对于仅返回唯一匹配项的替代方法,可以使用$setIntersection
运算符:
db.items.aggregate([
{ $match : {
_id: 5
}},
{ $project: {
items: {
$setIntersection: ['$items', [1,4,9]]
}
}}
])
这将返回:{ "_id" : 5, "items" : [ 1, 4, 9 ] }
。
(以下2012年9月的原始答案)
如果您希望文档操作发生在服务器端,您可以使用MongoDB 2.2 中的聚合框架:
db.items.aggregate(
// Match the document(s) of interest
{ $match : {
_id: 5
}},
// Separate the items array into a stream of documents
{ $unwind : "$items" },
// Filter the array
{ $match : {
items: { $in: [1, 9, 4] }
}},
// Group the results back into a result document
{ $group : {
_id: "$_id",
items: { $addToSet : "$items" }
}}
)
结果:
{
"result" : [
{
"_id" : 5,
"items" : [
9,
4,
1
]
}
],
"ok" : 1
}