0

我在 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 的填充,因为聚合不处理模式,但我可能是错的。

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

4

2 回答 2

2

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

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

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

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

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

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

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

于 2013-08-28T13:59:23.510 回答