[英]MongoDB find projection, matching elements with $ne
我有一个查询,返回包含对象数组的对象。 在该对象数组中,有些对象不应该处理。 这是我所拥有的类似对象:
{
_id: 12345,
data: [
{
state: 1,
info: "abc"
},{
state: 2,
info: "cde"
},{
state: 2,
info: "efg"
}
]
}
我只想显示状态不等于1的对象。 所以我想找回这样的东西:
{
_id: 12345,
data: [
{
state: 2,
info: "cde"
},{
state: 2,
info: "efg"
}
]
}
可能有数百个“主要”对象和数十个“子”对象。 我尝试使用查询:
col.find({'data.info': {$in: [] }, {_id: 1, data: { $elemMatch: { state: {$ne: 1 } } } }, {}, callback);
但这只给了我这个:
{
_id: 12345,
data: [
{
state: 2,
info: "cde"
}
]
}
换句话说,$ elemMatch可以完成应做的事情,但是我需要得到不同的结果。 那么,是否有一种方法可以在一个查询中执行此操作,也可以不进行预处理(在进一步的代码读取数据之前删除条目)?
$elemMatch
投影运算符仅返回数组中的第一个匹配元素。
为了过滤整个数组,MongoDB 2.2+中最好的方法是使用Aggregation Framework。 或者,您也可以使用Map / Reduce或在您的应用程序代码中执行此操作。
汇总示例:
db.data.aggregate(
// Initial match to limit number of documents
{ $match : {
data: { $elemMatch: { state: {$ne: 1 } } }
}},
// Convert the data array into a stream of documents
{ $unwind: "$data" },
// Limit to matching elements of the data array
{ $match : {
"data.state": {$ne: 1 }
}},
// Re-group by original document _id
{ $group: {
_id: "$_id",
data: { $push: "$data" }
}}
)
样本输出:
{
"_id" : 12345,
"data" : [
{
"state" : 2,
"info" : "cde"
},
{
"state" : 2,
"info" : "efg"
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.