我正在尝试找出在Mongo中构建数据的最佳方法,以模拟SQL中的简单连接或子查询。
假设我有经典的用户和帖子示例,其中一个集合中的用户和另一个集合中的帖子。我想查找所有城市是“伦敦”的用户的帖子。
我在这个问题中简化了一些事情,在我的真实场景中,将帖子作为数组存储在用户文档中将无法正常工作,因为每个用户不断插入会有1,000个“帖子”。
Mongos $ in运营商可以帮助吗? $ $可以处理10,000,000个条目的数组吗?
答案 0 :(得分:11)
老实说,如果你不能将“帖子”放到“用户”中,那么你有两个选择。
根据您的问题,您正在尝试做#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,我认为这就是你要找的东西。
您必须运行多个查询,但您绝对应该在应用端执行此操作。