如何处理mongo文档并获取数组

时间:2016-09-01 11:35:24

标签: mongodb mongodb-query aggregation-framework mongodb-aggregation

目前我正在处理一个问题,以处理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函数和查找查询来检索数据。

2 个答案:

答案 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 管道中,您现在正在对所有已过滤的文档进行分组,您可以在其中指定_idnull来计算所有输入文档的累计值作为一个整体。使用可用的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