在MongoDB中合并/汇总多个文档

时间:2019-11-10 19:23:45

标签: mongodb aggregation-framework


我的汇总存在一些问题。我有大量具有以下架构的平面文档:

{
  _id:ObjectId("5dc027d38da295b969eca568"),
  emp_no:10001,
  salary:60117,
  from_date:"1986-06-26",
  to_date:"1987-06-26"
}

这与雇员的年薪有关。数据是从关系数据库导出的,因此存在多个具有相同“ emp_no” 值的文档,但是它们的其余属性有所不同。我需要通过属性“ emp_no”的值来聚合它们,因此结果是:

//one document
{
  _id:ObjectId("5dc027d38da295b969eca568"),
  emp_no:10001,
  salaries: [
    {
      salary:60117,
      from_date:"1986-06-26",
      to_date:"1987-06-26"
    },
    {
      salary:62102,
      from_date:"1987-06-26",
      to_date:"1988-06-25"
    },
    ...
  ]
}

//another document
{
  _id:ObjectId("5dc027d38da295b969eca579"),
  emp_no:10002,
  salaries: [
    {
      salary:65828,
      from_date:"1996-08-03",
      to_date:"1997-08-03"
    },
    ...
  ]
}

//and so on

最后但并非最不重要的一点是,几乎有290万个文档,因此手动通过“ emp_no” 进行汇总会有些问题。
有什么方法可以仅使用mongo查询将它们聚合?我该怎么做?预先感谢您的帮助

1 个答案:

答案 0 :(得分:0)

聚合管道的组阶段可用于获取这种类型的聚合。在分组阶段中,将要分组的属性指定为_id字段的值。

以下查询如何为您工作?

db.collection.aggregate([
  {
    "$group": {
      "_id": "$emp_no",
      "salaries": {
        "$push": {
          "salary": "$salary",
          "from_data": "$from_date",
          "to_data": "$to_date"
        }
      },
      "emp_no": {
        "$first": "$emp_no"
      },
      "first_document_id": {
        "$first": "$_id"
      }
    }
  },
  {
    "$project": {
      "_id": "$first_document_id",
      "salaries": 1,
      "emp_no": 1
    }
  }
])