1

目前,我遇到了处理 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 函数和 find 查询来检索数据。

4

2 回答 2

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来计算所有输入文档作为一个整体的累积值。使用可用的累加器在分组文档上返回所需的聚合。累加器运算符 $push 用于此分组操作,因为它为每个组返回一个表达式值数组。

阶段中使用的累加器在$group文档通过管道时保持其状态(例如总数、最大值、最小值和相关数据)。

为了获取具有所需字段的文档,使用$project类似于SELECTSQL 的运算符来重命名字段名称并从分组字段中选择/取消选择要返回的字段。如果为字段指定 0,则不会在管道中将其发送到下一个操作员。

于 2016-09-01T12:10:18.230 回答
0

您不能使用 find 命令执行此操作。

尝试使用 mongodb 的聚合管道。

专门将 $group 与 $push 结合使用

见这里:https ://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group

于 2016-09-01T11:41:23.997 回答