包括所有现有字段并将新字段添加到文档

我想定义一个$项目汇总阶段,我可以指示它添加一个新的字段,并包含所有现有的字段,而不必列出所有现有的字段。

我的文档看起来像这样,有很多领域:

{ obj: { obj_field1: "hi", obj_field2: "hi2" }, field1: "a", field2: "b", ... field26: "z" } 

我想要这样做一个聚合操作:

 [ { $project: { custom_field: "$obj.obj_field1", //the next part is that I don't want to do field1: 1, field2: 1, ... field26: 1 } }, ... //group, match, and whatever... ] 

有没有像在这种情况下可以使用的“包含所有字段”关键字,或者其他方式来避免分别列出每个字段?

您可以使用$$ ROOT来引用根文档。 将这个文档的所有字段保存在一个字段中,然后尝试获取它(取决于您的客户端系统:Java,C ++,…)

  [ { $project: { custom_field: "$obj.obj_field1", document: "$$ROOT" } }, ... //group, match, and whatever... ] 

从MongoDB 3.4开始,我们可以使用$addFields聚合pipe道运算符来执行此操作:

$addFields阶段相当于$project阶段,它明确指定input文档中的所有现有字段并添加新字段。

 db.collection.aggregate([ { "$addFields": { "custom_field": "$obj.obj_field1" } } ]) 

>>>在这种情况下可以使用“包含所有字段”关键字,或者使用其他解决scheme?

不幸的是,在汇总操作中没有运营商“包括所有领域”。 唯一的原因是,为什么,因为汇总主要是为集合/计算来自集合字段(sum,avg等)的数据而创build的,并返回所有集合的字段并不是直接的目的。

从版本2.6.4开始,MongoDB对$project聚合pipe道没有这样的function。 从$project的文档 :

将只有指定字段的文档传递到pipe道中的下一个阶段。 指定的字段可以是来自input文档或新计算字段的现有字段。

默认情况下,_id字段包含在输出文档中。 要在输出文档中包含input文档中的其他字段,必须明确指定$ project中的包含。