Home > Software design >  How to join two collections in one single MongoDB query
How to join two collections in one single MongoDB query

Time:10-02

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" }
         }
}
])
  • Related