问题:MongoDB - 模拟连接或子查询

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

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

我在这个问题中简化了一些事情,在我的现实世界场景中,将帖子作为数组存储在用户文档中是行不通的,因为每个用户不断插入 1,000 个“帖子”。

Mongos $in 操作员可以在这里提供帮助吗? $in 可以处理包含 10,000,000 个条目的数组吗?

解答

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

  1. 非规范化帖子内的一些用户数据。然后,您可以只搜索一个集合。

  2. 做两个查询。 (一个找用户,另一个找帖子)

根据您的问题,您正在尝试执行 #2。

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

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

看,如果您打算为一组 10,000,000 个用户中的所有用户“查询”您的帖子,那么您已经过了“查询”阶段。您说自己每个用户都有 1,000 条帖子,所以您正在谈论查询“居住在伦敦的帖子的用户”_ 返回 100 毫秒的记录。

100M 记录不是查询,而是数据集!

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

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐