MongoDB - 如何编写嵌套组聚合查询
MongoDB - How to write a nested group aggregation query
我有一个这种格式的集合:
{
"place":"land",
"animal":"Tiger",
"name":"xxx"
},
{
"place":"land",
"animal":"Lion",
"name":"yyy"
}
我希望结果是这样的:
{
"place":"land".
"animals":{"Lion":"yyy", "Tiger":"xxx"}
}
我写了下面的查询。我觉得还需要再开一个小组赛但是写不出来
db.collection.aggregate({
'$group': {
'_id':{'place':'$place', 'animal':'$animal'},
'animalNames': {'$addToSet':'$name'}
}
})
需要进行哪些更改才能获得所需的结果?
$group
- 按 animals
分组。将 { k: "animal", v: "name" }
类型的对象推入 animals
数组。
$project
- 修饰输出文档。通过 $arrayToObject
. 将 animals
数组转换为 key-value 对
db.collection.aggregate([
{
"$group": {
"_id": "$place",
"animals": {
"$push": {
k: "$animal",
v: "$name"
}
}
}
},
{
$project: {
_id: 0,
place: "$_id",
animals: {
"$arrayToObject": "$animals"
}
}
}
])
如果您的版本 >=4.4,一个合理的替代方法是使用 $function
运算符:
db.foo.aggregate([
{$project: {
'income_statement.annual': {
$function: {
body: function(arr) {
return arr.sort().reverse();
},
args: [ "$income_statement.annual" ],
lang: "js"
}}
}}
]);
我有一个这种格式的集合:
{
"place":"land",
"animal":"Tiger",
"name":"xxx"
},
{
"place":"land",
"animal":"Lion",
"name":"yyy"
}
我希望结果是这样的:
{
"place":"land".
"animals":{"Lion":"yyy", "Tiger":"xxx"}
}
我写了下面的查询。我觉得还需要再开一个小组赛但是写不出来
db.collection.aggregate({
'$group': {
'_id':{'place':'$place', 'animal':'$animal'},
'animalNames': {'$addToSet':'$name'}
}
})
需要进行哪些更改才能获得所需的结果?
$group
- 按animals
分组。将{ k: "animal", v: "name" }
类型的对象推入animals
数组。$project
- 修饰输出文档。通过$arrayToObject
. 将
animals
数组转换为 key-value 对
db.collection.aggregate([
{
"$group": {
"_id": "$place",
"animals": {
"$push": {
k: "$animal",
v: "$name"
}
}
}
},
{
$project: {
_id: 0,
place: "$_id",
animals: {
"$arrayToObject": "$animals"
}
}
}
])
如果您的版本 >=4.4,一个合理的替代方法是使用 $function
运算符:
db.foo.aggregate([
{$project: {
'income_statement.annual': {
$function: {
body: function(arr) {
return arr.sort().reverse();
},
args: [ "$income_statement.annual" ],
lang: "js"
}}
}}
]);