考虑以下文件:
[
{
"name" : "nameA",
"class" : "classA",
"age" : 24,
"marks" : 45
},
{
"name" : "nameB",
"class" : "classB",
"age" : 22,
"marks" : 65
},
{
"name" : "nameC",
"class" : "classA",
"age" : 14,
"marks" : 55
}
]
我需要获取年龄和标记的最小值和最大值以及名称和类的不同值。
我知道我可以使用aggregate和group来获取age和mark的最大值和最小值一个查询,并且我可以使用不同的查询获得名称和类的不同值。
但我不想单独查询来获取该信息。有没有办法可以通过一个查询获得结果?假设我能以某种方式合并聚合和区分。
答案 0 :(得分:3)
当然,您可以使用一个聚合命令来完成。您需要将$group
与$addToSet运算符一起使用:
db.collection.aggregate([{
$group : {
_id : null,
name : { $addToSet : "$name" },
class : { $addToSet : "$class" },
ageMin : { $min : "$age" },
ageMax : { $max : "$age" },
marksMin : { $min : "$marks" },
marksMax : { $max : "$marks" }
}
}]);
$addToSet
将创建一个包含所选字段的唯一值的数组。
此聚合将为您的示例文档返回以下响应:
{
"_id" : null,
"name" : [
"nameC",
"nameB",
"nameA"
],
"class" : [
"classB",
"classA"
],
"ageMin" : 14,
"ageMax" : 24,
"marksMin" : 45,
"marksMax" : 65
}