如何在MongoDB中进行多重分组?

问题描述 投票:0回答:1

我一直在尝试为我的mongodb文档取得结果。我的文档如下所示:

{
    "_id" : "97f98668-bdc0-441c-ab12-15c0f4313e30",
    "row_id" : "927b1d4f-6357-44af-8cdb-daca7a6f89fd",
    "data" : {
        "info" : [ 
            {
                "name" : "dog",
                "value" : [ 
                    "3"
                ],
                "score" : 42
            }
        ]
    }
}

/* 2 */
{
    "_id" : "f1994888-8c22-4d29-8523-4ff3c504665a",
    "row_id" : "927b1d4f-6357-44af-8cdb-daca7a6f89fd",
    "data" : {
        "info" : [ 
            {
                "name" : "dog",
                "value" : [ 
                    "2"
                ],
                "score" : 70
            }
        ]
    }
}

/* 3 */
{
    "_id" : "6522979b-68f3-4f62-859c-93786b23caaa",
    "row_id" : "927b1d4f-6357-44af-8cdb-daca7a6f89fd",
    "data" : {
        "info" : [ 
            {
                "name" : "cat",
                "value" : [ 
                    "2"
                ],
                "score" : 62
            }
        ]
    }
}

我想先按row_id将它们分组,然后再按info.name分组。最终结构如下所示:

{
    "row_id": "927b1d4f-6357-44af-8cdb-daca7a6f89fd",
    "data":{
        "info" : [ 
            {
                "name" : "dog",
                "values" : [ 
                    {"value": "2", "score": 70},
                    {"value": "3", "score": 42}
                ]
            },
            {
                "name" : "cat",
                "values" : [ 
                    {"value": "2", "score": 62}
                ]
            },
        ]
    }
}

我尝试进行多个分组,但是没有按预期工作

mongodb mongodb-query aggregation-framework mongoose-schema
1个回答
2
投票

由于您已在数组中嵌套了对象,因此必须首先对数组进行$ unwind。您可以先通过$grouprow_id进行name,然后通过$group仅通过row_id进行

db.collection.aggregate([
  {
    $unwind: "$data.info" // unwind array first, you cannot group on objects inside an array
  },
  {
    $unwind: "$data.info.value" // unwind value to have only one value per record
  },
  {
    $group: {
      _id: { // group by row_id and name
        row_id: "$row_id",
        name: "$data.info.name"
      },
      values: {
        $push: {
          value: "$data.info.value",
          score: "$data.info.score"
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.row_id", // group again by row_id only
      data_info: {
        $push: {
          name: "$_id.name",
          values: "$values"
        }
      }
    }
  },
  {
    $project: { // project to desired shape
      _id: false,
      row_id: "$_id",
      data: {
        info: "$data_info"
      }
    }
  }
])

Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.