2

考虑以下一组文档:

[
  {
    "name" : "nameA",
    "class" : "classA",
    "age" : 24,
    "marks" : 45
  },
  {
    "name" : "nameB",
    "class" : "classB",
    "age" : 22,
    "marks" : 65
  },
  {
    "name" : "nameC",
    "class" : "classA",
    "age" : 14,
    "marks" : 55
  }
]

我需要获取年龄和标记的最小值和最大值以及名称和类别的不同值。

我知道我可以使用聚合和分组来通过一个查询来获取年龄和标记的最大值和最小值,并且我可以使用不同的查询来获取名称和类别的不同值。

但我不想单独查询来获取该信息。有没有一种方法可以通过一个查询获得结果?假设我是否可以以某种方式合并聚合和不同。

4

1 回答 1

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
}
于 2014-06-21T09:13:35.230 回答