Javascript MongoDB将集合中的所有键和值按特定字段分组

Javascript MongoDB将集合中的所有键和值按特定字段分组,javascript,mongodb,Javascript,Mongodb,我有这样的收藏: id:.. Category:Car Type:BMW id:.. Category:Car Type:Ferrari Color:Red id.. Category:Bikes Type:Mountain Bike id.. Category:Bikes Type:BMX [{Category:Car Type:[BMW,Ferrari] Color:[Red]}, {Category:Bikes Type:[Mountain Bike,BMX]}] 我想做一个聚合

我有这样的收藏:

id:..
Category:Car
Type:BMW

id:..
Category:Car
Type:Ferrari
Color:Red

id..
Category:Bikes
Type:Mountain Bike

id..
Category:Bikes
Type:BMX
[{Category:Car Type:[BMW,Ferrari] Color:[Red]},
{Category:Bikes Type:[Mountain Bike,BMX]}]
我想做一个聚合和一个分组,得到如下结果:

id:..
Category:Car
Type:BMW

id:..
Category:Car
Type:Ferrari
Color:Red

id..
Category:Bikes
Type:Mountain Bike

id..
Category:Bikes
Type:BMX
[{Category:Car Type:[BMW,Ferrari] Color:[Red]},
{Category:Bikes Type:[Mountain Bike,BMX]}]
因此,基本上,主字段是我们的类别,属于该类别的每个文档键都会被分类并对其值进行分组

是否有可能通过聚合实现这一点

我尝试使用$objectToArray制作,但它甚至不接近我想要的:

db.collection.aggregate([
  {
    $project: {
      data: {
        $objectToArray: "$$ROOT"
      }
    }
  },
  {
    $project: {
      data: "$data.k",
      value: "$data.v"
    }
  },
  {
    $unwind: "$data",
    
  },
  {
    $unwind: "$value",
    
  },
  {
    $group: {
      _id: null,
      
      keys: {
        $addToSet: "$data"
      },
      values: {
        $addToSet: "$value"
      }
    }
  }
])

你在正确的轨道上

将整个对象转换为数组时,还要保存“类别”字段

所需的阶段:

  • $project保存类别并将对象转换为数组
  • 展开数组以分别考虑每个字段
  • $match可删除
    \u id
    类别
    以及不希望从数组中分组的任何其他字段
  • $group by
    Category
    k
    将每个键的值推入一个数组
  • $group by
    Category
    将密钥和数组收集在一起
  • $project将具有收集值的数组转换为对象
  • $addFields将类别注入新对象
  • $replaceRoot以升级新对象

真正的英雄,huuuge,谢谢。只是一个简单的问题,我如何将其转换为数组。因为当我使用.toArray时,经常会出现类型后面跟着颜色的情况,当我刷新页面时,颜色是第一个元素,类型是最后一个元素,我需要相同的顺序。再次非常感谢你的回答。你好@Joe。这有点离题,但我提出了一个类似的有趣而困难的问题(可能只是对我而言)。也许如果你有时间,并且你愿意,你可以去看看,因为我很好奇你的意见。