【问题标题】:Can I use $project to return a field as the top level document in a mongo aggregation query?我可以使用 $project 将字段作为 mongo 聚合查询中的顶级文档返回吗?
【发布时间】:2013-10-26 09:16:57
【问题描述】:

我有一个类似下面的文档,我想在结果数组中返回当前顶级文档的一个字段作为顶级文档本身:

{ 
  field1:{contents:{}}
  field2:{othercontent:{}}
}

我希望聚合查询的结果返回以下内容

{
  contents:{}
}

这可以通过 $project 和聚合框架来完成吗?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    是的,您可以使用$project 来做到这一点。您只需告诉它使用dot notation 检索嵌套的contents 对象:

    db.items.aggregate( {$project: {contents:'$field1.contents'}} );
    

    另外,如果你想在输出中隐藏_id字段,你可以在$project参数中指定_id: 0

    db.items.aggregate( {$project: {contents:'$field1.contents', _id:0}} );
    

    【讨论】:

    • 谢谢,@w0lf。我现在意识到我并没有很好地提出我的问题来正确地关联我的问题,但是您上面的答案非常适合所写的问题。我已经开始另一个问题来解决我的具体问题。 stackoverflow.com/questions/19436510/…
    • 在我的情况下需要小改动:db.items.aggregate( [ {$project: {contents:'$field1.contents'}} ] );
    【解决方案2】:
    • 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" })
      

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 2017-02-19
      • 1970-01-01
      • 2013-11-15
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      相关资源
      最近更新 更多