【发布时间】:2012-10-25 18:10:07
【问题描述】:
假设我的 MongoDB 架构如下所示:
{car_id: "...", owner_id: "..."}
这是一个多对多的关系。例如,数据可能如下所示:
+-----+----------+--------+
| _id | owner_id | car_id |
+-----+----------+--------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
| 6 | 3 | 4 |
| 7 | 3 | 5 |
| 8 | 3 | 6 |
| 9 | 3 | 7 |
| 10 | 1 | 1 | <-- not unique
+-----+----------+--------+
我想获取每个车主拥有的汽车数量。在 SQL 中,这可能看起来像:
SELECT owner_id, COUNT(*) AS cars_owned
FROM (SELECT owner_id FROM car_owners GROUP BY owner_id, car_id) AS t
GROUP BY owner_id;
在这种情况下,结果如下所示:
+----------+------------+
| owner_id | cars_owned |
+----------+------------+
| 1 | 3 |
| 2 | 2 |
| 3 | 4 |
+----------+------------+
我怎样才能通过聚合框架使用 MongoDB 完成同样的事情?
【问题讨论】:
-
@JohnnyHK,我认为我列出我尝试完成此任务的 10 种不同方法不会帮助您或其他任何人更有效地回答这个问题,因为它们不起作用。我已经做了一些工作来准确解释我正在尝试做什么,以及我可能在 SQL 中采用的方法。我查看了上下 MongoDB 文档,但我的管道聚合方法都没有奏效,可能是因为我对使用聚合框架还是新手。
-
在您的架构中,每个文档是否只有一辆汽车(由 id 表示)?在这种情况下,要查找所有者拥有的汽车数量,您不只是在查找集合中有多少文档具有该 owner_id 吗?在这种情况下,您可以执行类似 db.foo.find( { owner_id : [owner id here] } ).count() 的操作来获取集合中具有该 owner_id 的文档数。
-
您现有的代码不起作用完全没问题,但是通过发布它我们可以看到您采取的方向以及您可能缺少的概念。
-
@Louisa,这是一个多对多的关系。可以有很多车和很多车主。
-
可以有多个文档具有相同的
owner_id/car_id对吗?例如owner_id = 1和car_id = 1? 的两个文档?
标签: mongodb aggregation-framework