Mongodb 聚合父文档中的嵌套文档
我有以下数据:Mongodb 聚合父文档中的嵌套文档,mongodb,Mongodb,我有以下数据: { "make" : "Toyota", "name" : "Corolla", "year" : "2012" "color" : "Blue" } { "make" : "Toyota", "name" : "Camry", "year" : "2016" "color" : "Blue" } { "make" : "Toyota", "name" : "Prius",
{
"make" : "Toyota",
"name" : "Corolla",
"year" : "2012"
"color" : "Blue"
}
{
"make" : "Toyota",
"name" : "Camry",
"year" : "2016"
"color" : "Blue"
}
{
"make" : "Toyota",
"name" : "Prius",
"year" : "2012"
"color" : "Black"
}
{
"make" : "Nissan",
"name" : "PathFinder",
"year" : 2012.0
"color" : "Black"
}
{
"make" : "Nissan",
"name" : "Qashqai",
"year" : 2011.0
"color" : "Black"
}
{
"make" : "Nissan",
"name" : "X-Trail",
"year" : 2009.0
"color" : "Blue"
}
我想在make
组中通过color
写入聚合查询,然后通过make
组进行分组
因此,我希望得到的结果摘录如下
[{
_id: "Toyota"
colors: [
{
_id: "Black"
cars: [{
"make" : "Toyota",
"name" : "Prius",
"year" : "2012"
"color" : "Black"
}]
},
{
_id: "Blue"
cars:[{
"make" : "Toyota",
"name" : "Corolla",
"year" : "2012"
"color" : "Blue"
},
{
"make" : "Toyota",
"name" : "Camry",
"year" : "2016"
"color" : "Blue"
}]
}
]
},
{
.... Nissan cars
}]
我已经尝试了下面的管道,并且已经接近了我想要的结果,但是并不理想
db.Cars.aggregate(
// Pipeline
[
// Stage 1
{
$group: {
_id: {make: '$make', color: '$color'},
cars: {$push: '$$CURRENT'}
}
},
// Stage 2
{
$group: {
_id: '$_id.make',
colors: {$push: '$$CURRENT'}
}
},
]
);
这导致了这种情况(注意颜色的\u id
字段):
编写查询以使输出更接近所需结果的任何帮助都很好将
$project
或$addFields
阶段添加到$map
颜色中。_id
来自颜色。_id.color
管道
db.cars.aggregate(
[
{
$group: {
_id: {make: '$make', color: '$color'},
cars: {$push: '$$CURRENT'}
}
},
{
$group: {
_id: '$_id.make',
colors: {$push: '$$CURRENT'}
}
},
{$project : {colors : {$map : {input : "$colors", as : "color", in : { "_id" : "$$color._id.color", cars : "$$color.cars" }}}}}
]
).pretty()
输出
>db.cars.aggregate( [ {$project : {_id : 0}}, { $group: { _id: {make: '$make', color: '$color'}, cars: {$push: '$$CURRENT'} } }, { $group: { _id: '$_id.make', colors: {$push: '$$CURRENT'} } }, {$project : {colors : {$map : {input : "$colors", as : "color", in : { "_id" : "$$color._id.color", cars : "$$color.cars" }}}}} ] ).pretty()
{
"_id" : "Toyota",
"colors" : [
{
"_id" : "Black",
"cars" : [
{
"make" : "Toyota",
"name" : "Prius",
"year" : "2012",
"color" : "Black"
}
]
},
{
"_id" : "Blue",
"cars" : [
{
"make" : "Toyota",
"name" : "Corolla",
"year" : "2012",
"color" : "Blue"
},
{
"make" : "Toyota",
"name" : "Camry",
"year" : "2016",
"color" : "Blue"
}
]
}
]
}
....//output omitted
>db.cars.aggregate( [ {$project : {_id : 0}}, { $group: { _id: {make: '$make', color: '$color'}, cars: {$push: '$$CURRENT'} } }, { $group: { _id: '$_id.make', colors: {$push: '$$CURRENT'} } }, {$project : {colors : {$map : {input : "$colors", as : "color", in : { "_id" : "$$color._id.color", cars : "$$color.cars" }}}}} ] ).pretty()
{
"_id" : "Toyota",
"colors" : [
{
"_id" : "Black",
"cars" : [
{
"make" : "Toyota",
"name" : "Prius",
"year" : "2012",
"color" : "Black"
}
]
},
{
"_id" : "Blue",
"cars" : [
{
"make" : "Toyota",
"name" : "Corolla",
"year" : "2012",
"color" : "Blue"
},
{
"make" : "Toyota",
"name" : "Camry",
"year" : "2016",
"color" : "Blue"
}
]
}
]
}
....//output omitted