Mongodb大数组或查询

时间:2016-03-05 17:18:46

标签: arrays mongodb

我的问题与mongo处理大型数组的能力有关。

我想在主题更新到主题的所有订阅者时发送推送通知。假设一个主题可以有一百万订阅者。

在主题文档中保存一个包含订阅它的所有用户ID的大型数组是否有效?或者保守的方式是否更好 - 为每个用户保留一系列订阅主题,然后查询用户集合以查找特定主题的订阅者?

编辑:

无论如何,我会在用户集合中保留一系列已订阅的主题(用于视图和编辑)

2 个答案:

答案 0 :(得分:1)

如果您的数组非常大且文档的累积大小超过16 MB,则将其拆分为另一个集合。您可以将集合中的主题及其所有订阅者放入单独的集合引用主题集合中。

答案 1 :(得分:1)

主要假设:主题相关和与人相关的元数据存储在不同的集合中,此处讨论的集合仅用于跟踪主题订阅者。

将订阅者存储为与主题标识符相关联的列表/数组作为文档键(意味着索引字段),可以实现高效的结构。获得感兴趣的主题后,您可以按主题标识符查找订阅者列表。在这里,正如@Saleem正确指出的那样,您需要警惕大型订阅者列表导致文档超过16MB文档大小限制。但是,不是通过制作一个不同的集合来处理这个问题而复杂化设计(如@Saleem所建议的那样),您可以简单地将订户列表(根据需要使用模数16MB操作分成多个部分)并为a创建多个文档。同一集合中的主题。鉴于主题标识符是索引字段,查找时间不会受到影响,因为16MB可以容纳大量的订阅者标识符,并且如果需要的话,所需的拆分数量应该相当低。

您建议的其他结构,其中订阅者标识符是文档中包含所有订阅主题的文档键,对于大型数据集而言,直观上不那么有效。该结构将涉及查找订阅该主题的所有订户。如果订阅的主题存储为列表/数组(似乎是可能的选择),则此查询将涉及$in子句,该子句比索引字段查找慢,即使对于非常大的用户群的小型主题列表也是如此。 / p>