Arrays Mongodb大型数组或查询

Arrays Mongodb大型数组或查询,arrays,mongodb,Arrays,Mongodb,我的问题与mongo处理大型阵列的能力有关 我想在更新主题时向该主题的所有订阅者发送推送通知。假设一个主题可以有一百万订户 在主题文档中保存一个包含所有订阅用户ID的巨大数组是否有效?还是保守的方法更好?为每个用户保留一个订阅主题数组,然后查询用户集合以查找特定主题的订阅者 编辑: 无论如何,我都会在用户集合中保留一个订阅主题数组(用于查看和编辑)如果您的数组非常大且文档的累积大小超过16MB,则将其拆分为另一个集合。您可以将集合中的主题及其所有订阅服务器放入引用主题集合的单独集合中 主要假设:

我的问题与mongo处理大型阵列的能力有关

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

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

编辑:


无论如何,我都会在用户集合中保留一个订阅主题数组(用于查看和编辑)

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

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

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


您建议的另一种结构是,订阅者标识符是文档密钥,文档中包含订阅者的所有主题,对于大型数据集来说,这种结构的效率显然不高。此结构将涉及查找订阅当前主题的所有订阅者。如果订阅的主题存储为列表/数组(似乎是可能的选择),则此查询将涉及一个
$in
子句,该子句比索引字段查找速度慢,即使对于用户基数非常大的小型主题列表也是如此。

您的庞大规模有多大?有数字吗?回答得很好。有没有关于如何处理拆分的建议?假设达到16mb,衡量文档并决定是添加到此集合还是创建拆分是否仍然有效?拆分的意思是存储多个文档,格式为
{topicID:'t_I',订阅方:[s_1,s_2,…,s_k]}
{topicID:'t_I',订阅方:[s_k+1,s_k+2,…,s_n]}
适用于同一收藏中topic t_i的n个订户。在插入数据之前,可以使用您选择的MongoDB API检查数据的大小,然后计算分割。