【问题标题】:Grouping the results of a group query in mongodb在 mongodb 中对组查询的结果进行分组
【发布时间】:2016-12-06 15:44:14
【问题描述】:

我有以下示例数据:

{
    "name": "Bob",
    "mi": "K",
    "martialStatus": "M",
    "age": 30,
    "city": "Paris",
    "job": "Engineer"
}
{
    "name": "Chad",
    "mi": "M",
    "martialStatus": "W",
    "age": 31,
    "city": "Paris",
    "job": "Doctor"
}
{
    "name": "Mel",
    "mi": "A",
    "martialStatus": "D",
    "age": 31,
    "city": "London",
    "job": "Doctor"
}
{
    "name": "Frank",
    "mi": "F",
    "martialStatus": "S",
    "age": 30,
    "city": "London",
    "job": "Engineer"
}

我正在尝试编写一个以以下格式返回结果的 mongo 查询: “人数”:4, “工作清单”:{ “工作”:“医生”, “年龄列表”:[ { “年龄”:31, “城市列表”:[ { “城市”:“伦敦”, “人们”: [ { “名称”:“梅尔”, “军事状态”:“D” } ] }, { “城市”:“巴黎”, “人们”: [ { “名称”:“乍得”, “军事状态”:“W” } ] }, { “城市”:“柏林”, ... ... ] } ] }

要尝试前两个级别(jobsList 和 ageList),我正在尝试以下

db.colName.aggregate([
    { 
        $group: { 
            _id: { job: "$job" },
            jobsList: {
                $push: {
                    age: "$age",
                    city: "$city",
                    name: "$name",
                    martialStatus: "$martialStatus"
                }
            }
        }
    },
    {
        $group: {
            _id: { age: "$age" }, 
            ageList: {
                $push: {
                    city: "$city", 
                    name: "$name", 
                    martialStatus: "$martialStatus"
                }
            }
        }
    }
]); 

尽管第一个分组/推送部分有效,但上述内容不起作用...关于如何获得该输出格式/分组的任何提示?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:
    db.colName.aggregate([
    {
        $group: {
            _id: { job: "$job", age: "$age", city: "$city" },
            people: { $push: { name: "$name", martialStatus: "$martialStatus" } }
        }
    },
    {
        $group: {
            _id: { job: "$_id.job", age: "$_id.age" },
            peopleCount: { $sum: { $size: "$people" } },
            cityList: { $push: { city: "$_id.city", people: "$people" } },
        }
    },
    {
        $group: {
            _id: { job: "$_id.job" },
            peopleCount: { $sum: "$peopleCount" },
            agesList: { $push: { age: "$_id.age", cityList: "$cityList" } }
        }
    },
    {
        $group: {
            _id: null,
            peopleCount: { $sum: "$peopleCount" },
            jobsList: { $push: { job: "$_id.job", agesList: "$agesList" } }
        }
    },
    {
        $project: { _id: 0, peopleCount: 1, jobsList: 1 }
    }
    ]);
    

    在你提供的集合上给我结果

    {
      "peopleCount" : 4,
      "jobsList" : 
      [ 
        { 
          "job" : "Engineer", 
          "agesList" : 
            [ 
              { 
                "age" : 30, 
                "cityList" : 
                  [ 
                    { 
                      "city" : "London", 
                      "people" : 
                        [ 
                          { "name" : "Frank", "martialStatus" : "S" } 
                        ] 
                    }, 
                    { 
                      "city" : "Paris", 
                      "people" : 
                        [ 
                          { "name" : "Bob", "martialStatus" : "M" } 
                        ] 
                    } 
                  ] 
              } 
            ]
        },
        { 
          "job" : "Doctor", 
          "agesList" : 
            [ 
              { 
                "age" : 31, 
                "cityList" : 
                  [ 
                    { 
                      "city" : "London", 
                      "people" : 
                        [ 
                          { "name" : "Mel", "martialStatus" : "D" } 
                        ] 
                    }, 
                    { 
                      "city" : "Paris", 
                      "people" : 
                        [ 
                          { "name" : "Chad", "martialStatus" : "W" } 
                        ] 
                    } 
                  ] 
              } 
            ] 
        } 
      ] 
    }
    

    这似乎是正确的。想,我不确定这是最好的解决方案。我是聚合框架的新手。

    【讨论】:

    • 这按预期工作。谢谢你,这是开始聚合框架的好方法:)。
    • 是否有可能展示案例如何在作业列表之前的顶部添加另一个参数:“peopleCount”:4
    • 你的情况是否有可能一个人住在多个城市或有多个工作,因此在你的收藏中会有多个文件对应一个人?
    • 答案取决于您是否希望 { "name": "Bob", "mi": "K", "martialStatus": "M", "age": 30, "city": "Paris", "job": "Engineer" }{ "name": "Bob", "mi": "K", "martialStatus": "M", "age": 30, "city": "Lyon", "job": "Software developer" } 将 1 或 2 添加到 peopleCount。换句话说,是否有一个人的唯一标识符,或者personCount 应该只是您集合中所有文档的大小?
    • 我更新了一个答案,让我知道它是否适合你。并将这个新请求包含在您的问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2013-07-03
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多