Javascript 如何使用mongoose聚合根据字段获取两个匹配文档的总和
我有两个系列“员工”,“办公室” 我试图找出每个包含办公室代码的区域有多少员工。但同一地区可能有不止一个办公室 这就是我的办公室文件的样子Javascript 如何使用mongoose聚合根据字段获取两个匹配文档的总和,javascript,mongoose,count,aggregation-framework,Javascript,Mongoose,Count,Aggregation Framework,我有两个系列“员工”,“办公室” 我试图找出每个包含办公室代码的区域有多少员工。但同一地区可能有不止一个办公室 这就是我的办公室文件的样子 [ { _id: "5b7d0f77e231b6b530b0ee5a", code: "OB123456", city: "Canmore" // some other fields }, { _id: "5b7d
[
{
_id: "5b7d0f77e231b6b530b0ee5a",
code: "OB123456",
city: "Canmore"
// some other fields
},
{
_id: "5b7d0f77e531b6b530b0ee5b",
code: "OB858758",
city: "Vancouver"
},
{
_id: "5b7d0f77e531b6b530b0ee5d",
code: "EE858758",
city: "Vancouver"
},
]
[
{
_id: "5b7d0f77e531b6b530b0edda",
name: 'Charlie',
office: {
code: 'OB123456'
// some other fields
}
},
{
_id: "5b7d0f73e531b6b530b0ee5b",
name: 'Bill',
office: {
code: 'EE858758'
}
},
{
_id: "5b7d0f77e531b6b530b0ee5n",
name: 'Echo',
office: {
code: 'OB123456'
}
},
];
这就是我的员工文档的外观
[
{
_id: "5b7d0f77e231b6b530b0ee5a",
code: "OB123456",
city: "Canmore"
// some other fields
},
{
_id: "5b7d0f77e531b6b530b0ee5b",
code: "OB858758",
city: "Vancouver"
},
{
_id: "5b7d0f77e531b6b530b0ee5d",
code: "EE858758",
city: "Vancouver"
},
]
[
{
_id: "5b7d0f77e531b6b530b0edda",
name: 'Charlie',
office: {
code: 'OB123456'
// some other fields
}
},
{
_id: "5b7d0f73e531b6b530b0ee5b",
name: 'Bill',
office: {
code: 'EE858758'
}
},
{
_id: "5b7d0f77e531b6b530b0ee5n",
name: 'Echo',
office: {
code: 'OB123456'
}
},
];
我正在调查猫鼬的总数,并且只做了尝试
await Employee.aggregate([
{
$lookup: {
from: 'offices',
localField: 'office.code',
foreignField: 'code',
as: 'officeCode'
},
$group: {
_id: 'officeCode.city',
count: { $sum: 1 }
}
}
]);
这肯定不起作用,我试着阅读了一些聚合文档,但没有想出一个好主意如何完成这项工作
提前感谢您的任何建议或建议
我正在寻找的样本输出
{
"Vancouver": 1,
"Canmore": 2
}
您必须从办公室开始,而不是从员工开始,这样您就可以为每个地区(城市)创建代码列表,然后查找以与您的员工进行映射
db.office.aggregate([
{
$group: {
_id: "$city",
codes: {
$addToSet: "$code"
}
}
},
{
$lookup: {
from: "employee",
localField: "codes",
foreignField: "office.code",
as: "employees"
},
},
{
$group: {
_id: null,
data: {
$push: {
k: "$_id",
v: {
$size: "$employees"
}
}
}
}
},
{
$replaceRoot: {
newRoot: {
"$arrayToObject": "$data"
}
}
}
])
最后两个阶段仅用于按照预期输出中的描述格式化结果