MongoDB - 模拟连接或子查询

时间:2010-07-07 21:54:28

标签: mongodb

我正在尝试找出在Mongo中构建数据的最佳方法,以模拟SQL中的简单连接或子查询。

假设我有经典的用户和帖子示例,其中一个集合中的用户和另一个集合中的帖子。我想查找所有城市是“伦敦”的用户的帖子。

我在这个问题中简化了一些事情,在我的真实场景中,将帖子作为数组存储在用户文档中将无法正常工作,因为每个用户不断插入会有1,000个“帖子”。

Mongos $ in运营商可以帮助吗? $ $可以处理10,000,000个条目的数组吗?

3 个答案:

答案 0 :(得分:11)

老实说,如果你不能将“帖子”放到“用户”中,那么你有两个选择。

  1. 对帖子内部的一些用户数据进行非规范化。然后,您只需搜索一个集合。
  2. 做两个查询。 (一个找用户另一个找帖子)
  3. 根据您的问题,您正在尝试做#2。

    从理论上讲,您可以构建一个用户ID(或引用)列表,然后查找属于该用户$in该阵列的所有帖子。但显然这种方法是有限的。

      

    $ $可以处理10,000,000个条目的数组吗?

    看,如果您计划在一组 10,000,000个用户中“查询”所有用户的帖子,那么您已经过了“查询”阶段。你自己说每个用户都有1,000个帖子,所以你在谈论“有住在伦敦的帖子的用户”的查询返回100M的记录。

    100M记录不是查询,这是一个数据集!

    如果您担心违反$in命令,我强烈建议您使用 map / reduce 。 Mongo Map / Reduce将为您创建一个新的系列。然后,您可以根据需要修剪或汇总此数据集。

答案 1 :(得分:3)

$ in可以处理100,000个条目。我从未尝试过10,000,000个条目,但查询(查询也是文档)必须小于4mb(就像每个文档一样),因此不可能有10,0000,0000个条目。

为什么不在Posts集合中包含用户及其城镇?您可以索引此城镇,因为您可以索引嵌入实体的属性。您不再需要模拟联接,因为您可以查询其嵌入式用户的城镇上的帖子。

这意味着您必须在用户所在城镇发生变化时更新帖子,但这种情况不会经常发生。如果您在Posts集合中索引UserId,则此更新将很快。

答案 2 :(得分:2)

我有类似的东西,但我的设置是针对“用户”和“消息”。我所做的是添加对用户的引用,有点像外键。我使用了来自users集合的生成的“_id”,并将其存储为“消息”中的密钥。对于用户发送的每条消息,我将其保存到“messages”集合中。你应该阅读dbrefs,我认为这就是你要找的东西。

您必须运行多个查询,但您绝对应该在应用端执行此操作。