I have one model called Param and it has relation with other model called Port. When I populate Param model, I get access to all Port properties. It has many properties but I will point out only those that are necessary:
//Port
{
username: 123556,
rxm_name: 'Name #2'
}
There is also another, unrelated collection called Report, which has the following properties:
//Report
{
username: 123556,
box_number: 4423
}
It is worth mentioning, that there are almost 900.000 documents inside Report collection.
box_number is not unique, but username is. Also, there may be some username-s from Port that exist in Report collection.
I used an aggregate function to count all different unique box_number-s. This will get amount of username-s for each box_number:
const totalUsers = await Report.aggregate([{
"$group": {
_id: {
"box_number": "$box_number",
},
count: {
$sum: 1
}
}
}]);
This query returns the following:
[
{
_id: {
box_number: 38032
},
count: 273
},
// and so on..
]
Now I must perform a query to link username,rxm_name and box_number. Basically, I must show how many username-s are in each box_number and group them by rxm_name. I am stuck for hours, but I am not able to think of such query. Are there any points that I am missing?
CodePudding user response:
You will need $lookup to link 2 collections into one single aggregate command. Here's the aggregate you can use:
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" }
}
}
])
