在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
应该只是您集合中所有文档的大小?我更新了一个答案,让我知道它是否适用于您。并将此新请求包括在您的问题中。