Mongodb加上';加入';

Mongodb加上';加入';,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我在mongodb有一个“报告”集合。集合包含报表所属用户的ObjectId。我目前正在进行聚合,以便可以按用户对报告进行分组 db.reports.aggregate( { $group: { _id: "$user", stuff: { $push: { things: { properties

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

db.reports.aggregate(
    { 
        $group: { 
            _id: "$user", 
            stuff: { 
                $push: {
                    things: {
                        properties: "$properties"
                    }
                }
            }
        }
    },  
    { 
        $project: { 
            _id: 0, 
            user: "$_id", 
            stuff: "$stuff"
        }
    }
)
这给了我一个用户id数组和报告“stuff”。不只是userId,我想知道我是否可以形成聚合,这样我就可以点击users集合并返回关于用户的更多信息,而不仅仅是userId

可能吗?我使用mongoose作为ORM,但是看看mongoose文档,aggregate看起来是mongodb的聚合函数的直通。不要认为我可以利用mongoose的populate,因为aggregate没有处理模式,但我可能错了


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

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

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

Mongoose不会直接提供帮助,也不一定会使查询其他用户信息的效率比一次对大量用户执行
$in
(一组
用户ID
)更高。(文档中的
$

这方面确实没有解决办法,因为缺少连接是MongoDB目前有意设计的(即,它是如何工作的)。您可以考虑两种途径:

  • 您可能会发现另一个数据库平台更适合您尝试运行的查询类型
  • 在聚合结果返回到客户端代码后,您可以按照上面的建议尝试使用
    $in
    (这是Mongoose处理获取相关文档的方法之一)。只需获取用户ID,并批量请求关联的用户文档。虽然它有更多的网络流量,但取决于您希望如何显示结果,您可以认为它是一种优化,仅通过向用户显示额外的用户信息(如果可能的话),通过增量加载额外的数据。
    您可以将这两个集合合并为一个集合,然后进行聚合。在一个集合中不需要具有相同的结构化顶级文档。标记A或B类型的每个文档并调整涉及A类型文档的查询以包括A类型的文档并不太困难


    您可能不喜欢它的外观,但会为您设置“连接”。

    请更新您的答案,以包括$lookup,这是mongodb连接方式