MongoDB $项目:保留以前的管道字段

时间:2013-12-10 14:48:46

标签: mongodb aggregation-framework

在MongoDB投影中,有没有办法指定一些新字段(但同时保留输入到管道投影阶段的字段)?我没有重命名现有的任何字段。

因此,如果我从一个具有'field1'和'field2'的集合开始,并执行以下投影:

{ $project: { field3: { $gt: ['$field1', 10] } } }

我希望最终将'field1','field2'和'field3'作为下一阶段的输入或聚合框架的输出。

我试图通过排除_id将投影置于排除模式,但这不起作用。

3 个答案:

答案 0 :(得分:9)

MongoDB 2.6引入了一个新的$$ROOT聚合变量,几乎做了你想做的事情:它将包括在当前管道阶段处理的完整文档,所以你不要需要知道或指定要包含的字段。

将您的示例聚合并添加fields投影与$$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问题跟踪器中的此条目:SERVER-5781 - Implement $addFields aggregation stage for using expression language to add new fields to a document

答案 1 :(得分:8)

$project需要指定要传递的字段,$addFields将返回所有字段并添加或替换指定的字段。

{ $addFields: { field3: { $gt: ['$field1', 10] } } }

将完全达到你想要的效果。

请注意,此功能已在Mongo 3.4版中添加。

答案 2 :(得分:1)

默认情况下仅投影_id。您必须指定必须投影的其他字段。

{ $project: { field1:1,field2:1, field3: { $gt: ['$field1', 10] } } }

{ $project: { field1:'$field1',field2:'$field2', field3: { $gt: ['$field1', 10] } } }