简体   繁体   中英

How to join two collections in one single MongoDB query

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?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM