我在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集合的数组中。
答案 0 :(得分:2)
不,你不能这样做,因为MongoDB中没有连接(不在普通查询,MapReduce或聚合框架中)。
聚合功能一次只能访问一个集合。
Mongoose不会直接帮助,或者必须使查询其他用户信息比在一大批用户($in
数组)上执行userId
更有效。 ($in
docs here)
由于缺少连接目前是MongoDB的故意设计(即,它是如何工作的),因此确实没有解决方法。您可以考虑两种途径:
$in
(这是Mongoose处理相关文档的方式之一)。只需抓取userIds,并批量请求关联的用户文档。虽然网络流量要多一些,但根据您希望如何显示结果,您可能会认为这是一种优化,只能通过逐步加载额外数据来获取向用户显示的额外用户信息(如果可能的话)。 / LI>
醇>
答案 1 :(得分:0)
您可以将两个集合合并为一个,然后进行聚合。您不需要在集合中具有相同的结构化顶级文档。标记A或B类型的每个文档并调整涉及A类文档的查询,如果文档是A类,则包含它并不太难。
你可能不喜欢它的外观,但会为你设置“加入”。