Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 具有聚合框架的嵌套组_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Mongodb 具有聚合框架的嵌套组

Mongodb 具有聚合框架的嵌套组,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,在我的收藏中,我有大量的文档,每个文档包含4种类型的类别 组 main类别 子类别 子类别 我正在寻找一种方法来$group通过group和group内部应该有一个maincegory数组,在maincegory中应该有一个subCategory数组,在subCategory中应该有一个subcategegegory数组。结果应仅包含类别的值/名称 预期结果: const result = [ { "group": &q

在我的收藏中,我有大量的文档,每个文档包含4种类型的类别

  • main类别
  • 子类别
  • 子类别
我正在寻找一种方法来
$group
通过
group
group
内部应该有一个
maincegory
数组,在
maincegory
中应该有一个
subCategory
数组,在
subCategory
中应该有一个
subcategegegory
数组。结果应仅包含类别的值/名称

预期结果:

const result = [
            {
              "group": "Teknik",
              "mainCategory": [
                {
                  "name": "Gaming",
                  "subCategory": [
                    {
                      "name": "Playstation",
                      "subSubCategory": [
                        {"name": "Games"},
                        {"name": "Accessories"},
                        {"name": "Console"}
                      ]
                    },
                    {
                      "name": "Xbox",
                      "subSubCategory": [
                        {"name": "Games"},
                        {"name": "Accessories"},
                        {"name": "Console"}
                      ]
                    }
                  ]
                }, {
                  "name": "Audio",
                  "subCategory": [
                    {
                      "name": "Headphones",
                      "subSubCategory": [
                        {"name": "Wireless"},
                        {"name": "Non Wireless"},
    
                      ]
                    },
                    {
                      "name": "Speakers",
                      "subSubCategory": [
                        {"name": ""},
                      ]
                    }
                  ]
                },
    
              ]
            }
]
我认为问题在于我需要
$push
父类别中的每个类别,并创建新的
$groups
?但是当添加更多的
$group
时,只有最后一个被“保存”。其他人似乎没有被“拯救”。还是我做错了什么

基于prev的示例数据和工作代码。测试数据

收藏中的产品结构

productName :"Horizon Zero Dawn"
group:"Teknik"
mainCategory: "Gaming"
subCategory:"Playstation"
subSubCategory: "Games"
我的集合

const categories = await Product.aggregate([
        {$match: {group: 'Teknik'}},
        {
          $group: {
            _id: {
              group: '$group',
              mainCategory: '$mainCategory',
              subCategory: '$subCategory',
              subSubCategory: '$subSubCategory',
            }
          },
        },
        {
          $group: {
            _id: "$_id.group",
            mainCategory: {
              $push:
                {
                  name: "$_id.mainCategory",
                  subCategory: {
                    name: "$_id.subCategory",
                    subSubCategory: {
                      name: "$_id.subSubCategory"
                    }
                  }
                }
            },
          }
        },
      ]); 
这样,我为每个子类别得到一个对象,但我希望它们在同一个对象中

"_id": "Teknik",
    "mainCategory": [
    {
            "name": "Gaming",
            "subCategory": {
                "name": "Xbox",
                "subSubCategory": {
                    "name": "Games"
                }
            }
        },
    {
            "name": "Spel & Gaming",
            "subCategory": {
                "name": "Xbox",
                "subSubCategory": {
                    "name": "Accessories"
                }
            }
        },
]

该过程是从阵列的末级开始准备:

  • 子类别(按低于3级的字段分组)
  • 子类别(按低于2级的字段分组,并推到准备好的1级以上)
  • 主要类别(按低于1级的字段分组,并推至高于准备好的2级)
  • 小组(项目和展示准备好的3级)
  • 让我们一步一步看

    • 您的
      $match
      条件
    • $group
      by只有3个主字段,不添加
      子类别
    • 该组准备
      子类别
      数组
    • 在上面的
      $group
      中,将有可能重复
      子类别
      ,因此这将删除重复项,如果您不想删除,则可以跳过此部分
    • 现在,
      $group
      仅由2个主字段
    • 这将准备
      子类别
      数组,推送我们在上述组中准备的
      名称
      子类别
      数组
    • $group
      按主
      字段
    • 这将准备
      main类别
      数组,推送我们在上述组中准备的
      name
      子类别
      数组
    • $project
      删除
      \u id
      并显示
      主类别
      字段

    游乐场:

    @turivishal它在帖子的顶部,const result=[…]但是现在已经澄清了。大约有40000个文档,所以我在上面的链接中添加了一些示例数据。非常感谢!使用我提供的数据按预期工作。但是,我注意到我没有插入共享组但不共享主类别的测试数据。很抱歉。我用更准确的测试数据和代码更新了mongoplayground。如果您能给我一些关于如何解决这个问题的建议,我将不胜感激。我可以在许多文档中看到subSubCategory是空字符串,您对此的期望是什么?我可以看到这一点,让我知道我是否丢失了。空字符串就在那里,因为有一个空值比每次检查元素是否存在更简单。有些产品有子产品,有些没有。对不起,我不明白你的最后一句话?我只希望组名“teknik”一次,然后mainCategory应该是一个数组,其中包含所有主要类别(Mobil、Spel&Gaming、Ljud&Bild)。当subSub为空时,我不想删除主对象,如上所述。我已经更新了答案,您可以检查,问题在最后一组中,只需按
    字段分组,让我知道是否有任何问题,
    db.collection.aggregate([
      { $match: { group: "Teknik" } },
    
      {
        $group: {
          _id: {
            group: "$group",
            mainCategory: "$mainCategory",
            subCategory: "$subCategory"
          },
          subSubCategory: {
            $push: { name: "$subSubCategory" }
          }
        }
      },
    
      {
        $addFields: {
          subSubCategory: { $setUnion: ["$subSubCategory", [] ] }
        }
      },
    
      {
        $group: {
          _id: {
            group: "$_id.group",
            mainCategory: "$_id.mainCategory"
          },
          subCategory: {
            $push: {
              name: "$_id.subCategory",
              subSubCategory: "$subSubCategory"
            }
          }
        }
      },
    
      {
        $group: {
          _id: "$_id.group",
          mainCategory: {
            $push: {
              name: "$_id.mainCategory",
              subCategory: "$subCategory"
            }
          }
        }
      },
    
      {
        $project: {
          _id: 0,
          group: "$_id",
          mainCategory: 1
        }
      }
    ])