MongoDB嵌套数组聚合

时间:2018-08-21 20:43:14

标签: mongodb aggregation-framework

我想汇总以下示例数组的数据。

 [
  {
    "_id": "5b7c0540342100091a375793",
    "pages": [
      {
        "name": "ABCD",
        "sections": [
          {
            "name": "sectionThird",
            "id": 2,
            "value": [
              10,
              50,
              20
            ]
          }
        ]
      }
    ]
  },
  {
    "_id": "5b3cd546342100514b4683a2",
    "pages": [
      {
        "name": "ABCD",
        "sections": [
          {
            "name": "sectionFourth",
            "id": 2,
            "value": [
              19,
              5,
              8
            ]
          },
          {
            "name": "sectionThird",
            "id": 2,
            "value": [
              60
            ]
          }
        ]
      },
      {
        "name": "EFGH",
        "sections": [
          {
            "name": "sectionFourth",
            "id": 2,
            "value": [
              5
            ]
          },
          {
            "name": "sectionThsads",
            "id": 2,
            "value": [
              8
            ]
          }
        ]
      }
    ]
  }
]

我想要以下输出:

 [
  {
    "page": "ABCD",
    "sections": [
      {
        "name": "sectionThird",
        "totalValue": 140
      },
      {
        "name": "sectionFourth",
        "totalValue": 32
      }
    ]
  },
  {
    "page": "EFGH",
    "sections": [
      {
        "name": "sectionFourth",
        "totalValue": 5
      },
      {
        "name": "sectionThsads",
        "totalValue": 8
      }
    ]
  }
]

在上面的示例数组中,您可以看到有多个文档以“页面”作为键之一,它们也是对象的数组。每个页面对象都有一个键“名称”,它将对于“页面”数组中的每个对象都是唯一的。 “页面”对象具有“部分”键,并且它们中也具有“名称”键,这对于每个对象来说都是唯一的。

因此,将输出数组按page.name分组,然后按所有页面对象中的sections.name分组,并在具有相同部分名称的页面对象中将整个部分中的所有值数组总和。

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总。

{$unwind每个页面和每个部分,后跟$group$sum,将每个部分的值求和,$push将这些部分的值推回到页面数组中。

db.col.aggregate([
{"$unwind":"$pages"},
{"$unwind":"$pages.sections"},
{"$group":{
  "_id":{"pagename":"$pages.name","sectionname":"$pages.sections.name"},
  "totalTime":{"$sum":{"$sum":"$pages.sections.value"}}
}},
{"$group":{
  "_id":"$_id.pagename",
  "sections":{"$push":{"name":"$_id.sectionname","totalTime":"$totalTime"}}
}}])