{
"data": [
{
"_id": 555,
"username": "jackson",
"status": "i am coding",
"comments": [
{
"user": "bob",
"comment": "bob me "
},
{
"user": "daniel",
"comment": "bob the builder"
},
{
"user": "jesus",
"comment": "bob the builder"
},
{
"user": "hunter",
"comment": "bob the builder"
},
{
"user": "jeo",
"comment": "bob the builder"
},
{
"user": "jill",
"comment": "bob the builder"
}
]
}
]
}
所以我希望得到_id :555
和user:bob
的结果我尝试使用下面的代码,但我不能让它工作,它返回空数组
app.get('/all',function(req , res){
db.facebook.find({_id:555},{comments:[{user:"bob"}]},function(err,docs){res.send(docs,{data:docs});});
} );
我希望结果如下所示,并带有user:bob
{
"_id": 555,
"username": "jackson",
"status": "i am coding",
"comments": [
{
"user": "bob",
"comment": "bob me "
}
]
}
答案 0 :(得分:1)
只有aggregate或mapReduce可以从输出中的子数组中排除项目。最短的是使用$ redact:
db.facebook.aggregate({
$redact:{
$cond:{
if:{$and:[{$not:"$username"},{$ne:["$user","bob"]}]},
then: "$$PRUNE",
else: "$$DESCEND"
}
}
})
<强>说明:强>
从整个文档开始,$reduct
将应用于每个子文档。对于每个子文档$reduct
将修剪它或下降。我们希望保留顶级文档,这就是我们{$not:"$username"}
条件的原因。它可以防止顶级文档被修剪。在下一级,我们有comments
数组。 $prune
会将条件应用于每个comments数组项。对于所有注释,第一个条件{$not:"$username"}
都为true,对于user!=“bob”的所有子文档,第二个条件{$ne:["$user","bob"]}
都为真,因此这些文档将被修剪。
更新:
db.facebook.aggregate([{
$redact:{
$cond:{
if:{$and:[{$not:"$username"},{$ne:["$user","bob"]}]},
then: "$$PRUNE",
else: "$$DESCEND"
}
}
}], function(err,docs){})
还有一件事:$prune
是新的运算符,仅在MongoDB 2.6中可用