Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mongodb中将组查询的结果分组_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

在mongodb中将组查询的结果分组

在mongodb中将组查询的结果分组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有以下样本数据: { "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": "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岁, “城市列表”:[ { “城市”:“伦敦”, “人”:[ { “名称”:“Mel”, “军事地位”:“D” } ] }, { “城市”:“巴黎”, “人”:[ { “姓名”:“乍得”, “军事地位”:“W” } ] }, { “城市”:“柏林”, ... ... ] } ] }

为了尝试前两个级别(工作列表和年龄列表),我尝试下面的方法

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"
                }
            }
        }
    }
]); 
但是,尽管第一个组/推送部分可以工作,但上述方法不起作用……关于如何获得该输出格式/分组的任何提示

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在您的情况下,一个人是否可能居住在多个城市或有多份工作,因此在您的收藏中会有多份与一个人对应的文档?答案取决于您是否想要
{“姓名”:“鲍勃”、“米”:“K”、“军事状态”:“M”、“年龄”:30、“城市”:“巴黎”、“工作”:“工程师”}
{“姓名”:“鲍勃”,“密苏里州”:“K”,“军事状态”:“M”,“年龄”:30,“城市”:“里昂”,“工作”:“软件开发人员”}
要在
人员计数中添加1或2。换句话说,是否有一个人的唯一标识符,或者
personCount
应该只是您集合中所有文档的大小?我更新了一个答案,让我知道它是否适用于您。并将此新请求包括在您的问题中。