首页 > 解决方案 > mongodb中有没有办法在多个级别进行分组

问题描述

我有一个文档,其中包含一个数组,如下所示。这是第一份文件。

{
  "_id": "5d932a2178fdfc4dc41d75da",
  "data": [
    {
      "nestedData": [
        {
          "_id": "5d932a2178fdfc4dc41d75e1",
          "name": "Special 1"
        },
        {
          "_id": "5d932a2178fdfc4dc41d75e0",
          "name": "Special 2"
        }
      ]
    }
  ]
}

我需要在聚合框架的nestedData 数组中使用_id 查找(加入)另一个集合。

我需要查找的第二个文档是

{
  "_id": "5d8b1ac3b15bc72d154408e1",
  "status": "COMPLETED",
  "rating": 4
}

我知道我需要 $unwind 两次才能将 nestedData 数组转换为对象。但是我如何再次分组以形成相同的对象,如下所示

{
  "_id": "5d932a2178fdfc4dc41d75da",
  "data": [
    {
      "array": [
        {
          "_id": "5d932a2178fdfc4dc41d75e1",
          "name": "Special 1",
          "data": {
            "_id": "5d8b1ac3b15bc72d154408e1",
            "status": "COMPLETED",
            "rating": 4
          },
        {
          "_id": "5d932a2178fdfc4dc41d75e0",
          "name": "Special 2",
          "data": {
            "_id": "5d8b1ac3b15bc72d154408e0",
            "status": "COMPLETED",
            "rating": 4
          },
        }
      ]
    }
  ]
}

标签: mongodbaggregation-framework

解决方案


试试这个查询

db.testers.aggregate([
    {$lookup: {
        from: 'demo2',
        pipeline: [
            { $sort: {'_id': 1}},
        ],
        as: 'pointValue',
    }},
    {
       $addFields:{
            "data":{
                $map:{
                    "input":"$data",
                    "as":"doc",
                    "in":{
                        $mergeObjects:[
                            "$$doc",
                            {
                                "nestedData":{
                                    $map:{
                                        "input":"$$doc.nestedData",
                                        "as":"nestedData",
                                        "in":{
                                            $mergeObjects:[
                                               { $arrayElemAt: [  {
                                                     "$map": { 
                                                      "input": {
                                                                 "$filter": {
                                                                  "input": "$pointValue",
                                                                  "as": "sn",
                                                                  "cond": {
                                                                    "$and": [
                                                                      { "$eq": [ "$$sn._id", "$$nestedData._id" ] },
                                                                 ]
                                                          }
                                                      }
                                                      },"as": "data",
                                                      "in": {
                                                        "name": "$$nestedData.name",
                                                        "data":"$$data",
                                                      }}
                                                }, 0 ] },'$$nestedData'

                                            ],
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    },
     {$project: { pointValue: 0 } }
]).pretty()

推荐阅读