在具有特定ID和用户名的mongodb中查找文档

时间:2014-05-15 16:10:48

标签: json node.js mongodb

{
    "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 :555user: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 "
        }
    ]
}

1 个答案:

答案 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"]}都为真,因此这些文档将被修剪。

使用mongodb本机驱动程序

在node.js中

更新:

db.facebook.aggregate([{
 $redact:{
      $cond:{ 
         if:{$and:[{$not:"$username"},{$ne:["$user","bob"]}]}, 
         then: "$$PRUNE", 
         else: "$$DESCEND" 
      }
 }
}], function(err,docs){})

还有一件事:$prune是新的运算符,仅在MongoDB 2.6中可用