【问题标题】:How to process mongo documents and get field wise data in array如何处理 mongo 文档并在数组中获取字段明智的数据
【发布时间】:2016-09-01 20:10:18
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您需要使用聚合框架来获得所需的结果。运行以下聚合管道,过滤集合中的文档进入管道以使用 $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,则不会在管道中将其发送到下一个操作员。

    【讨论】:

    • 其实这里不需要$project。文档中的一个额外字段是可以忍受的。
    【解决方案2】:

    你不能用 find 命令来做到这一点。

    尝试使用 mongodb 的聚合管道。

    具体使用 $group 与 $push 结合使用

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

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 1970-01-01
      • 2021-06-29
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2013-08-12
      • 2016-03-08
      相关资源
      最近更新 更多