arrays - 在 mongoDB 中索引大数组

标签 arrays mongodb performance indexing multikey

根据 mongoDB 文档,不建议为大型数组创建多键索引,那么替代选项是什么?

我想在我的应用程序用户的联系人之一也开始使用该应用程序时通知他们,因此我必须上传和管理每个用户的联系人列表。 我们使用 mongoDB 和主服务器的副本集以及两台辅助机器。 mongo 是否可以处理具有数百个值的数组的多键索引? 数十万用户的数百个联系人可能很难管理。

多键解决方案如下所示:

{
  customerId: "id1",
  contacts: ["aaa", "aab", "aac", .... "zzz"]
}

索引:createIndex({ 联系人:1 })

另一种解决方案是将每个联系人保存在其自己的文档中,并保存与他相关的所有应用程序用户:

{
  phone: "aaa",
  contacts: ["id1", "id2", "id3"]
},
{
  phone: "aab",
  contacts: ["id1"]
},
{
  phone: "aac",
  contacts: ["id1"]
},
......
{
  phone: "zzz",
  contacts: ["id1"]
}
index: createIndex( { phone: 1 } )

上传联系人列表时,两者的写入性能都很差:
第一个用于计算巨大的索引,第二个用于并发更新大量文档。
有更好的方法吗?
我正在使用带有两台辅助计算机的副本集,分片键有帮助吗?

谢谢

最佳答案

为了索引保存数组值的字段,MongoDB 为数组中的每个元素创建一个索引键。 These multikey indexes support efficient queries 针对数组字段。 所以如果我是你,我的数据模型将是这样的:

{
    customerId: "id1",
    contacts: ["_idx", "_idy", "_idw", .... "_idz"]
}

然后在联系人上创建索引。 MongoDB 默认在 ids 上创建索引。因此,您必须为非应用程序用户创建新文档,只需尝试添加一个字段,例如“app_user”:true/false。

对于索引性能,您可以将其设为 build in the background没有任何问题,对于副本集,this is how it's done.

对于sharding ,它对你没有帮助,因为你甚至无法对任何东西进行分片,因为你的集群中有一个主节点。分片需要至少 2 组主要 Mongo 实例,因此在您的情况下,您可以添加第四台服务器,然后拥有两个副本集(一个主实例和一个辅助实例),然后对它们进行分片,并将您的系统转换为 2 个复制分片。

一旦实现这一点,它显然会平衡两个分片之间的负载,尽管一百个文档对于 MongoDB 来说并不是真正需要处理的。

另一方面,如果您要进行分片,并且使用 Mongodb 3.4 或更高版本,则需要对配置服务器进行更多设置。

关于arrays - 在 mongoDB 中索引大数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49342939/

相关文章:

c - 初学者 : How to use an array instead of several variables; loops, 结构基础知识

javascript - Array.filter 无法正常工作

mongodb 多个匹配条件并返回具有通用名称的文档

android - Android 中 query() 和 rawQuery() 方法的性能差异

java - IntelliJ IDEA Aspectj(Ajc 编译器)在每次 Make 之后加载类需要花费太多时间

c++ - 如何找到我的阵列使用的内存

ios - 从其他设备收到 NSData 后,NSKeyedUnarchiver 不起作用

java - 如何正确使用JMH? ArrayList 示例

Mongodb递归搜索对象数组

javascript - MongoDB + Express : How to verify login credentials using db. collection().findOne() 还是 .find()?