嵌套的数组分组

时间:2017-05-31 06:40:59

标签: mongodb

每个类别,子类别和标准都有3个主集合,我将构建框架,其中包含类别,子类别和标准的任何可能组合,这些组合将存储如下 -

框架文档下面添加了标准列表作为嵌入对象,进一步具有类别,子类别和标准的单个对象。你可以将criteriaconfig称为你在mysql中调用的链接表。

[
  {
    "id": "592bc3059f3ad715002b2331",
    "name": "Framework1",
    "description": "framework 1 for testing",
    "criteriaConfigs": [
      {
        "id": "592bc3059f3ad715002b232f",
        "category": {
          "id": "591c2f5faa187956b2d0fb39",
          "name": "category1",
          "description": "category1",
          "deleted": false,
          "createdDate": 1495019359558
        },
        "subCategory": {
          "id": "591c2f5faa187956b2d0fb83",
          "name": "subCat1",
          "description": "subCat1"
        },
        "criteria": {
          "id": "591c2f5faa187956b2d0fbad",
          "name": "criteria1",
          "measure": "Action"
        }
      },
      {
        "id": "592bc3059f3ad715002b232e",
        "category": {
          "id": "591c2f5faa187956b2d0fb37",
          "name": "Process",
          "description": "Enagagement"
        },
        "subCategory": {
          "id": "591c2f5faa187956b2d0fb81",
          "name": "COMM / BRANDING",
          "description": "COMM / BRANDING"
        },
        "criteria": {
          "id": "591c2f5faa187956b2d0fba9",
          "name": "Company representative forgets about customer on hold",
          "measure": ""
        }
      }    ]
  },
  {
    "id": "592bc3059f3ad715002b2332",
    "name": "Framework2",
    "description": "framework 2 for testing",
    "criteriaConfigs": [
      {
        "id": "592bc3059f3ad715002b232f",
        "category": {
          "id": "591c2f5faa187956b2d0fb39",
          "name": "category1",
          "description": "category1"
        },
        "subCategory": {
          "id": "591c2f5faa187956b2d0fb83",
          "name": "subCat1",
          "description": "subCat1"
        },
        "criteria": {
          "id": "591c2f5faa187956b2d0fbad",
          "name": "criteria1",
          "measure": "Action"
        }
      }
    ]
  }
] 

我需要一个包含框架的视图,该框架将包含所有类别列表和内部类别,将有添加的子类别列表,内部子类别将包含单个框架的标准列表。

预期结果 -

[
  {
    "id": "f1",
    "name": "Framework1",
    "description": "framework 1 for testing",
    "categories": [
      {
          "id": "c2",
          "name": "category2",
          "description": "category2",
           "subCategories": [
            {
          "id": "sb1",
          "name": "subCat1",
          "description": "subCat1",
          "criterias": [
            {
          "id": "cr1",
          "name": "criteria1",
          "measure": "Action"
            },
            {
          "id": "cr2",
          "name": "criteria2",
          "measure": "Action"
            },
            {
          "id": "cr3",
          "name": "criteria3",
          "measure": "Action"
            }]
            },
            {
          "id": "sb2",
          "name": "subCat2",
          "description": "subCat2",
          "criterias": [
            {
          "id": "cr1",
          "name": "criteria1",
          "measure": "Action"
            },
            {
          "id": "cr4",
          "name": "criteria4",
          "measure": "Action"
            }]
            }]
      },
      {
          "id": "c1",
          "name": "category1",
          "description": "category1",
           "subCategories": [
            {
          "id": "sb3",
          "name": "subCat3",
          "description": "subCat3",
          "criterias": [
            {
          "id": "cr1",
          "name": "criteria1",
          "measure": "Action"
            },
            {
          "id": "cr2",
          "name": "criteria2",
          "measure": "Action"
            }
            ]},
            {
          "id": "sb2",
          "name": "subCat2",
          "description": "subCat2",
          "criterias": [
            {
          "id": "cr1",
          "name": "criteria1",
          "measure": "Action"
            },
            {
          "id": "cr4",
          "name": "criteria4",
          "measure": "Action"
            }]
            }
            ]
      }]
      },
      {
    "id": "f2",
    "name": "Framework2",
    "description": "framework 2 for testing",
    "categories": [
      {
          "id": "c2",
          "name": "category2",
          "description": "category2",
           "subCategories": [
            {
          "id": "sb4",
          "name": "subCat5",
          "description": "subCat5",
          "criterias": [
            {
          "id": "cr1",
          "name": "criteria1",
          "measure": "Action"
            },
            {
          "id": "cr3",
          "name": "criteria3",
          "measure": "Action"
            }]
            },
            {
          "id": "sb2",
          "name": "subCat2",
          "description": "subCat2",
          "criterias": [
            {
          "id": "cr1",
          "name": "criteria1",
          "measure": "Action"
            },
            {
          "id": "cr4",
          "name": "criteria4",
          "measure": "Action"
            }]
            }]
      },
      {
          "id": "c1",
          "name": "category1",
          "description": "category1",
           "subCategories": [
            {
          "id": "sb3",
          "name": "subCat3",
          "description": "subCat3",
          "criterias": [
            {
          "id": "cr1",
          "name": "criteria1",
          "measure": "Action"
            },
            {
          "id": "cr2",
          "name": "criteria2",
          "measure": "Action"
            }
            ]},
            {
          "id": "sb2",
          "name": "subCat2",
          "description": "subCat2",
          "criterias": [
            {
          "id": "cr1",
          "name": "criteria1",
          "measure": "Action"
            },
            {
          "id": "cr4",
          "name": "criteria4",
          "measure": "Action"
            }]
            }
            ]
      }]
      }
      ]

注意 - 类别文档没有对子类别的任何引用,并且子类别目前没有对条件对象的任何引用,因为它们是主数据并且是通用的,框架是动态创建的。

1 个答案:

答案 0 :(得分:0)

如果您想尝试在聚合中完成所有工作,可以先按子类别分组,然后按类别分组:

db.collection.aggregate([
    {$unwind:"$criteriaConfigs"},
    {$project:{ 
               _id:0,
               category:"$criteriaConfigs.category",
               subCategory:"$criteriaConfigs.subCategory",
               criteria:"$criteriaConfigs.criteria"
    }},
    {$group:{
             _id:{"category":"$category","subCategory":"$subCategory"},
             criteria:{$addToSet:"$criteria"}
    }},
    {$group:{
             _id:{"category":"$_id.category"}, 
             subCategories:{$addToSet:{subCategory:"$_id.subCategory",
                                       criteria:"$criteria"}}
    }},
    {$project:{
               _id:0,category:"$_id.category",
               subCategories:"$subCategories"
    }}
])

根据您计划返回数据的方式,返回每个唯一组合可能更有效:

db.collection.aggregate([
    {$unwind:"$criteriaConfigs"},
    {$group:{
             _id:{
                  category:"$criteriaConfigs.category.name",
                  subCategory:"$criteriaConfigs.subCategory.name",
                  criteria:"$criteriaConfigs.criteria.name"
                 }
    }},
    {$project:{
               _id:0,
               category:"$_id.category",
               subCategory:"$_id.subCategory",
               criteria:"$_id.criteria"
    }}
])

我不确定你的问题是什么形状你期望返回数据,所以你可能需要调整它。