【发布时间】:2013-10-26 09:16:57
【问题描述】:
我有一个类似下面的文档,我想在结果数组中返回当前顶级文档的一个字段作为顶级文档本身:
{
field1:{contents:{}}
field2:{othercontent:{}}
}
我希望聚合查询的结果返回以下内容
{
contents:{}
}
这可以通过 $project 和聚合框架来完成吗?
【问题讨论】:
标签: mongodb mongodb-query
我有一个类似下面的文档,我想在结果数组中返回当前顶级文档的一个字段作为顶级文档本身:
{
field1:{contents:{}}
field2:{othercontent:{}}
}
我希望聚合查询的结果返回以下内容
{
contents:{}
}
这可以通过 $project 和聚合框架来完成吗?
【问题讨论】:
标签: mongodb mongodb-query
是的,您可以使用$project 来做到这一点。您只需告诉它使用dot notation 检索嵌套的contents 对象:
db.items.aggregate( {$project: {contents:'$field1.contents'}} );
另外,如果你想在输出中隐藏_id字段,你可以在$project参数中指定_id: 0:
db.items.aggregate( {$project: {contents:'$field1.contents', _id:0}} );
【讨论】:
db.items.aggregate( [ {$project: {contents:'$field1.contents'}} ] );
从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" })
【讨论】: