【问题标题】:Mongodb aggregate with 'join'带有“加入”的MongoDB聚合
【发布时间】:2013-07-12 01:30:26
【问题描述】:

我在 mongodb 中有一个“报告”集合。该集合包含报表所属用户的 ObjectId。我目前正在做一个汇总,以便我可以按用户对报告进行分组。

db.reports.aggregate(
    { 
        $group: { 
            _id: "$user", 
            stuff: { 
                $push: {
                    things: {
                        properties: "$properties"
                    }
                }
            }
        }
    },  
    { 
        $project: { 
            _id: 0, 
            user: "$_id", 
            stuff: "$stuff"
        }
    }
)

这给了我一组用户 ID 和报告“东西”。我想知道的不仅仅是 userId,我是否可以形成聚合,这样我就可以点击 users 集合并返回有关用户的更多信息,而不只是 userId。

这可能吗?我使用 mongoose 作为 ORM,但是查看 mongoose 文档,聚合看起来是直接通过 mongodb 的聚合函数。不要认为我可以利用 mongoose 的填充,因为聚合不处理模式,但我可能是错的。

最后报告是计算机生成的,每个用户可能有数百万。这使我无法将报告与 users 集合一起存储在数组中。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    不,您不能这样做,因为 MongoDB 中没有连接(不是在普通查询、MapReduce 或聚合框架中)。

    聚合函数一次只能访问一个集合。

    Mongoose 不会直接提供帮助,也不会使查询附加用户信息比一次对大量用户(userId 数组)执行 $in 更有效。 ($in 文档here)

    确实没有解决此问题的方法,因为缺少连接是目前 MongoDB 的有意设计(即,它就是这样工作的)。您可能会考虑的两条路径:

    1. 您可能会发现另一个数据库平台更适合您尝试运行的查询类型。
    2. 在聚合结果返回到您的客户端代码后,您可以尝试按照上面的建议使用$in(这是 Mongoose 处理获取相关文档的方式之一)。只需获取 userId,并批量请求关联的 User 文档。虽然网络流量要多一些,但取决于您希望如何显示结果,您可能会认为它是一种优化,仅通过增量加载额外数据来获取向用户显示的额外用户信息(如果可能的话)。

    【讨论】:

    • 请更新您的答案以包括 $lookup 这是 mongodb 的连接方式
    【解决方案2】:

    您可以将这两个集合合二为一,从而进行聚合。您不需要在集合中具有相同的结构化顶级文档。标记 A 或 B 类型的每个文档并调整涉及 A 类型文档的查询以包含该文档是否为 A 类型并不难。

    您可能不喜欢它的外观,但会为“加入”做好准备。

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 2021-08-25
      • 2013-09-22
      • 2021-01-08
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多