【问题标题】:How to join two collections in one single MongoDB query如何在一个 MongoDB 查询中加入两个集合
【发布时间】:2021-11-22 12:20:20
【问题描述】:

我有一个名为Param 的模型,它与另一个名为Port 的模型有关系。当我填充Param 模型时,我可以访问所有Port 属性。它有很多属性,但我只指出那些必要的:

//Port 
{
 username: 123556,
 rxm_name: 'Name #2'
}

还有另一个不相关的集合Report,它具有以下属性:

//Report 
{
  username: 123556,
  box_number: 4423 
}

值得一提的是,Report 集合中有近 900.000 个文档。 box_number 不是唯一的,但 username 是唯一的。此外,Report 集合中可能存在来自Port 的一些username-s。

我使用聚合函数来计算所有不同的唯一 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..
]

现在我必须执行查询以链接 usernamerxm_namebox_number。基本上,我必须显示每个box_number 中有多少username-s,并将它们按rxm_name 分组。我被困了几个小时,但我想不出这样的查询。我有什么遗漏的地方吗?

【问题讨论】:

    标签: mongodb express mongoose aggregation-framework


    【解决方案1】:

    您需要 $lookup 将 2 个集合链接到一个聚合命令中。这是您可以使用的聚合:

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

    【讨论】:

    • 谢谢!我最终使用了不同的路线,但您为我指明了正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2020-09-03
    • 2016-09-27
    • 2012-09-15
    • 2012-05-11
    • 2020-05-12
    相关资源
    最近更新 更多