我有一个叫Param
的模型,它与另一个叫Port
的模型有关系。当我填充Param
模型时,我可以访问所有Port
属性。它有许多属性,但我将只指出那些必要的:
//Port
{
username: 123556,
rxm_name: 'Name #2'
}
还有另一个不相关的集合Report
,它具有以下属性:
//Report
{
username: 123556,
box_number: 4423
}
值得一提的是,Report
集合中有近900.000个文档。box_number
不是唯一的,但username
是。此外,Port
中的username
-s可能存在于Report
集合中。
我使用一个聚合函数来计数所有不同的唯一box_number
-s。这将为每个box_number
获得username
-s的数量:
const totalUsers = await Report.aggregate([{
"$group": {
_id: {
"box_number": "$box_number",
},
count: {
$sum: 1
}
}
}]);
这个查询返回以下内容:
[
{
_id: {
box_number: 38032
},
count: 273
},
// and so on..
]
现在我必须执行一个查询链接username
rxm_name
box_number
。基本上,我必须显示每个box_number
中有多少username
-s,并按rxm_name
对它们进行分组。我被困了几个小时,但我想不出这样的问题。我还遗漏了什么要点吗?
需要$lookup将两个集合链接到一个聚合命令中。以下是您可以使用的聚合:
db.Report.aggregate([
{
$lookup:
{
from: "Port",
localField: "username",
foreignField: "username",
as: "Report2"
}
},
{ $unwind : "$Report2" },
{
$group:
{
_id: { box_number: "$box_number", username: "$username" },
count: {
$sum: 1
},
rxm_name: { $addToSet: "$Report2.rxm_name" }
}
}
])