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。这有点离题,但我提出了一个类似的有趣而困难的问题(可能只是对我而言)。也许如果你有时间,并且你愿意,你可以去看看,因为我很好奇你的意见。