Mongodb汇总与'加入'

时间:2013-07-13 18:22:39

标签: mongodb mongoose aggregation-framework

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

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

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

这可能吗?我使用mongoose作为ORM,但是看看mongoose docs,聚合看起来是直接传递到mongodb的聚合函数。不要以为我可以利用mongoose的populate,因为聚合不处理架构,但我可能是错的。

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

2 个答案:

答案 0 :(得分:2)

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

聚合功能一次只能访问一个集合。

Mongoose不会直接帮助,或者必须使查询其他用户信息比在一大批用户($in数组)上执行userId更有效。 ($in docs here

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

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

答案 1 :(得分:0)

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

你可能不喜欢它的外观,但会为你设置“加入”。