目前我正在处理一个问题,以处理mongodb文档并获得字段明智的值。例如,假设mongo包含以下文档:
[
{ "name": "test1", "age": 20, "gender": "male" },
{ "name": "test2", "age": 21, "gender": "female" },
{ "name": "test3", "age": 30, "gender": "male"}
]
预期输出:
{
"name": ["test1","test2","test3"],
"age": [20,21,30],
"gender": ["male","female", "male"]
}
是否可以以上述格式从mongo中检索数据?我不想写一些javascript函数来处理这个。查看使用mongo函数和查找查询来检索数据。
答案 0 :(得分:3)
您需要使用聚合框架来获得所需的结果。运行以下聚合管道,该管道使用 $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
来计算所有输入文档的累计值作为一个整体。使用可用的accumulators在分组文档上返回所需的聚合。累加器运算符$ push用于此分组操作,因为它返回每个组的表达式值数组。
$group
阶段中使用的累加器会在文档进入管道时保持其状态(例如总数,最大值,最小值和相关数据)。
要获取包含所需字段的文档,使用与SQL中的SELECT
类似的 $project
运算符来重命名字段名称并选择/取消选择字段从分组的字段中返回。如果为字段指定0,则不会将其在管道中发送给下一个运算符。
答案 1 :(得分:0)
使用find命令无法执行此操作。
尝试使用mongodb的聚合管道。
特别将$ group与$ push结合使用
见这里:https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group