在 Mongodb 中,如何仅将必需的字段投影到 mongodb 中的嵌入对象中,其中键将是同一文档中选定字段的值,并根据字段的相似值对它们进行分组 如果您查看下面预期的结果,则必须对相同的
car_id
进行分组,并且值必须是 ObjectId
的键值对,并且只有我想要的选定字段,即 accessories
。
假设我想使用具有 brand
的 honda
进行匹配
以下是我在名为 CARS 的集合中收集的文档
{
_id : '1'
car_id : 'A'
brand : 'honda'
accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]
},
{
_id : '2'
car_id : 'A'
brand : 'honda'
accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]
},
{
_id : '3'
car_id : 'B'
brand : 'honda'
accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]
}
{
_id : '4'
car_id : 'C'
brand : 'honda'
accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]
}
以下是我期待的结果
{
'A' : {
'1': {accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]}
'2': {accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]}
},
'B' : {
'3': {accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]}
},
'C' : {
'4': {accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]}
},
}
$group
- 按 car_id
分组。使用包含 cars
(k
) 和 _id
(v
数组) 字段的文档设置 accessories
数组字段。
$group
- 按 null
分组,以便将所有文档合而为一。使用文档 data
(k
) 和 car_id
(来自 v
的键值对)数组设置 cars
数组字段。
$replaceRoot
- 通过将 data
数组转换为键值对,用新文档替换输入文档。
db.collection.aggregate([
{
$group: {
_id: "$car_id",
cars: {
$push: {
k: "$_id",
v: {
accessories: "$accessories"
}
}
}
}
},
{
$group: {
_id: null,
data: {
$push: {
k: "$_id",
v: {
$arrayToObject: "$cars"
}
}
}
}
},
{
$replaceRoot: {
newRoot: {
$arrayToObject: "$data"
}
}
}
])