MongoDB$项目:保留以前的管道字段
在MongoDB投影中,是否有办法指定一些新字段(但同时保留输入到管道投影阶段的字段)?我没有重命名任何现有字段 因此,如果我从具有“field1”和“field2”的集合开始,并执行以下投影:MongoDB$项目:保留以前的管道字段,mongodb,aggregation-framework,Mongodb,Aggregation Framework,在MongoDB投影中,是否有办法指定一些新字段(但同时保留输入到管道投影阶段的字段)?我没有重命名任何现有字段 因此,如果我从具有“field1”和“field2”的集合开始,并执行以下投影: { $project: { field3: { $gt: ['$field1', 10] } } } 我想以“field1”、“field2”和“field3”作为下一阶段的输入或聚合框架的输出结束 我试图通过排除_id将投影置于排除模式,但这不起作用。默认情况下仅投影\u id。您必须指定必须投影的
{ $project: { field3: { $gt: ['$field1', 10] } } }
我想以“field1”、“field2”和“field3”作为下一阶段的输入或聚合框架的输出结束
我试图通过排除_id将投影置于排除模式,但这不起作用。默认情况下仅投影
\u id
。您必须指定必须投影的其他字段
{ $project: { field1:1,field2:1, field3: { $gt: ['$field1', 10] } } }
或
MongoDB 2.6引入了一个新的聚合变量,它几乎满足了您的需求:它将包含当前管道阶段正在处理的完整文档,因此您不需要知道或指定要包含哪些字段 以聚合为例,使用
$$ROOT
添加字段
投影:
db.pipeline.aggregate(
{ $project: {
field3: {
$gt: ['$field1', 10]
},
fields: "$$ROOT"
}}
)
输出将包括新计算字段和所有原始字段:
{
"_id" : ObjectId("53b56cc542974939144cee2a"),
"field3" : false,
"fields" : {
"_id" : ObjectId("53b56cc542974939144cee2a"),
"field1" : 1,
"field2" : 2,
"field3" : 3
}
}
MongoDB 3.3.11引入了
addFields
聚合阶段,可以满足您的需求。请参阅MongoDB问题跟踪器中的此项:。其中,$project
需要指定要传递的字段,将返回所有字段并添加或替换指定的字段
{ $addFields: { field3: { $gt: ['$field1', 10] } } }
将完全实现你想要的
请注意,这项功能是在Mongo 3.4版中添加的。如果我知道作为投影输入存在的所有字段,这项功能就会起作用。因为这是自动生成过程的一部分,所以很难(不是不可能,但不是理想的)在任何给定的投影之前跟踪哪些字段可用。我正在寻找一种可以自动让这些现有字段通过的解决方案(但这可能不存在——只是询问是否存在)。
默认情况下始终包含_id字段。
中的语句隐式提到默认情况下不会投影其余字段。在中也提出了这个问题,其中包含一些有用的(不同的)答案。请注意,$addFields
也可以替换或更改现有字段(如果您为其指定相同的名称),同时包括所有其他字段,例如,如果您希望在数组上使用$filter
,但在投影中保留所有其他字段,这将非常有用。
{ $addFields: { field3: { $gt: ['$field1', 10] } } }