您需要使用聚合框架来获得所需的结果。运行以下聚合管道,该管道过滤集合中的文档进入管道以使用$match
运算符进行分组。这类似于find()
查询过滤器。
db.collection.aggregate([
{ "$match": { "age": { "$gte": 20 } } }, // filter on users with age >= 20
{
"$group": {
"_id": null,
"name": { "$push": "$name" },
"age": { "$push": "$age" },
"gender": { "$push": "$gender" }
}
},
{
"$project": {
"_id": 0,
"name": 1,
"age": 1,
"gender": 1
}
}
])
样本输出
{
"name": ["test1", "test2", "test3"],
"age": [20, 21, 30],
"gender": ["male", "female", "male"]
}
在上述管道中,第一个管道步骤是$match
类似于 SQL 的 WHERE 子句的运算符。上面的示例过滤字段上的传入文档age
(年龄大于或等于 20)。
这里要注意的一件事是,在执行管道时,MongoDB 将操作员通过管道相互连接。这里的“管道”取的是 Linux 的意思:一个算子的输出变成后面一个算子的输入。每个运算符的结果是一个新的文档集合。所以Mongo执行前面的管道如下:
collection | $match | $group | $project => result
下一个管道阶段是$group
运营商。在$group
管道内,您现在正在对所有过滤后的文档进行分组,您可以在其中指定一个_id
值null
来计算所有输入文档作为一个整体的累积值。使用可用的累加器在分组文档上返回所需的聚合。累加器运算符 $push 用于此分组操作,因为它为每个组返回一个表达式值数组。
阶段中使用的累加器在$group
文档通过管道时保持其状态(例如总数、最大值、最小值和相关数据)。
为了获取具有所需字段的文档,使用$project
类似于SELECT
SQL 的运算符来重命名字段名称并从分组字段中选择/取消选择要返回的字段。如果为字段指定 0,则不会在管道中将其发送到下一个操作员。