排除mongodb中子文档数组中的字段

时间:2015-02-13 08:48:34

标签: node.js mongodb aggregation-framework

我有两个文件

image文件:

{_id:123,user:{user_sub_docuemnt},thumb:'dqwdqwdqwdw'}

post文件:

{_id:444,
 user:{user_sub_document},
 attach:[{_id:123,
          user:{user_sub_docuemnt},
          thumb:'dqwdqwdqwdw'}
        ]
 }

user_sub_document包含password字段,因此我需要排除该字段。

这是我到目前为止所做的:

Post.aggregate([
        {$match: {'user._id': {$in:idArr}}},

        {$project:{content:1,attach:1,pub_date:1,'user.avatar':1}},
    ],function(err,posts){
        if(err){
            throw err
        }else{
            res.send(posts)
        }
    })

这只会限制用户在Post级别,附加数组中还有另一个user_sub_document,所以我试过这个

{$project:{content:1,attach:1,'attach.user':0,pub_date:1,'user.avatar':1}},

这会给我一个错误The top-level _id field is the only field currently supported for exclusion

请帮助我!

1 个答案:

答案 0 :(得分:2)

您可以使用简单的find()语句来实现此目的:

Post.find({"user._id":{$in:idArr}},
          {"content":1,
           "user.avatar":1,
           "pub_date":1,
           "attach.user.avatar":1})

如果您出于某种原因选择汇总,可以修改aggregation pipeline,如下所示:

  • $match具有特定用户ID的记录。
  • $project仅显示必填字段。

代码:

Post.aggregate([
{$match:{"user._id":{$in:idArr}}},
{$project:{"user.avatar":1,
           "attach.user.avatar":1,
           "pub_date":1,
           "content":1}}],function(err,resp){
           // handle response
         })