我有一个类似于以下内容的文档,我想在结果数组中返回当前顶级文档的字段作为顶级文档:
{
field1:{contents:{}}
field2:{othercontent:{}}
}
我希望我的聚合查询的结果返回以下内容
{
contents:{}
}
可以使用$ project和聚合框架吗?
答案 0 :(得分:16)
是的,您可以使用$project
来执行此操作。您只需要告诉它使用dot notation检索嵌套的contents
对象:
db.items.aggregate( {$project: {contents:'$field1.contents'}} );
此外,如果您要隐藏输出中的_id
字段,可以在_id: 0
参数中指定$project
:
db.items.aggregate( {$project: {contents:'$field1.contents', _id:0}} );
答案 1 :(得分:0)
从Mongo 3.4
开始,$replaceRoot
聚合运算符可用于将一个文档替换为另一个文档(在本例中为子文档):
// { field1: { content: { a: 1, b: 2 } }, field2: { othercontent: {} } }
// { field1: { content: { c: 1, d: 2 } }, field2: { othercontent: {} } }
db.collection.aggregate({ $replaceRoot: { newRoot: "$field1" } })
// { content: { a: 1, b: 2 } }
// { content: { c: 1, d: 2 } }
从Mongo 4.2
开始,$replaceWith
运算符也可以使用:
db.collection.aggregate({ $replaceWith: "$field1" })