我想从mongo db aggergtion管道中排除一个字段,在阅读完文档之后,我认为我需要指定1或0来保持字段(参见 http://docs.mongodb.org/manual/reference/operator/aggregation/project/) 所以我尝试了以下(使用node
所以我尝试了以下(使用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' ] } });