MongoDB: 如何在聚合管道中将所有文档合并为单个文档

MongoDB: How to merge all documents into a single document in an aggregation pipeline

我的当前聚合输出如下:

[
    {
        "courseCount": 14
    },
    {
        "registeredStudentsCount": 1
    }
]

该数组有两个文档。我想将所有文档组合成一个文档,其中包含 mongoDB

中的所有字段
{
    $group: {
      "_id": "null",
      data: {
        $push: "$$ROOT"
      }
    }
  }

当你将其添加为最后一个管道时,它会将所有文档放在数据下,但这里的数据将是一个对象数组。

你的情况是

{ "data":[
    {
        "courseCount": 14
    },
    {
        "registeredStudentsCount": 1
    }
] }

另一种方法是,

db.collection.aggregate([
  {
    $group: {
      "_id": "null",
      f: {
        $first: "$$ROOT",
        
      },
      l: {
        $last: "$$ROOT"
      }
    }
  },
  {
    "$project": {
      "output": {
        "courseCount": "$f.courseCount",
        "registeredStudentsCount": "$l.registeredStudentsCount"
      },
      "_id": 0
    }
  }
])

它不像第一个那样动态。由于您有两个文档,因此可以使用这种方法。它输出

[
  {
    "output": {
      "courseCount": 14,
      "registeredStudentsCount": 1
    }
  }
]

在第二种方法中使用额外的管道

 {
    "$replaceRoot": {
      "newRoot": "$output"
    }
  }

你会得到输出

[
  {
    "courseCount": 14,
    "registeredStudentsCount": 1
  }
]
 db.collection.aggregate([
 {
   $group: {
    _id: 0,
     merged: {
    $push: "$$ROOT"
   }
   }
  },
 {
  $replaceRoot: {
  newRoot: {
    "$mergeObjects": "$merged"
   }
  }
 }
])

解释:

  1. 使用推送将输出文档分组在一个字段中
  2. 用合并的对象替换文档根目录

Plyaground