当前位置 : 主页 > 网页制作 > Nodejs >

node.js – 使用$project进行mongodb聚合以有条件地排除字段

来源:互联网 收集:自由互联 发布时间:2021-06-16
我想从mongo db aggergtion管道中排除一个字段,在阅读完文档之后,我认为我需要指定1或0来保持字段(参见 http://docs.mongodb.org/manual/reference/operator/aggregation/project/) 所以我尝试了以下(使用node
我想从mongo db aggergtion管道中排除一个字段,在阅读完文档之后,我认为我需要指定1或0来保持字段(参见 http://docs.mongodb.org/manual/reference/operator/aggregation/project/)

所以我尝试了以下(使用node.js mongoose,但语法与plain mongo完全相同):

aggregate.match({ date: { $gte : today } });
aggregate.sort('-date');
aggregate.group({
    _id: '$name',
    date: { $first: '$date' },
    user: { $first: '$user' },
    app: { $first: '$app' }
});
aggregate.project({
    _id: 1,
    last: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$date', 0 ] },
    user: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$user', 0 ] },
    app: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$app', 0 ] }
});

但是这样做,我以这样的文件结束:

[ 
  {
    _id: 'devices',
    user: 0,
    app: 0,
    last: 0
  },
  { 
    _id: 'undo',
    user: 'test',
    app: 'truc',
    last: Mon Jan 26 2015 16:21:53 GMT+0100 (CET)
  }
]

我希望只有在_id撤消时才会显示用户,应用和日期.

怎么实现呢?

谢谢!

从mongoDB 3.6开始,您可以使用 the REMOVE variable有条件地排除字段.

在您的特定情况下,项目阶段应如下所示:

aggregate.project({
    _id: 1,
    last: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$date', '$$REMOVE' ] },
    user: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$user', '$$REMOVE' ] },
    app: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$app', '$$REMOVE' ] }
});
网友评论