在MongoDB投影中,有没有办法指定一些新字段(但同时保留输入到管道投影阶段的字段)?我没有重命名现有的任何字段。
因此,如果我从一个具有'field1'和'field2'的集合开始,并执行以下投影:
{ $project: { field3: { $gt: ['$field1', 10] } } }
我希望最终将'field1','field2'和'field3'作为下一阶段的输入或聚合框架的输出。
我试图通过排除_id将投影置于排除模式,但这不起作用。
答案 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] } } }