繁体   English   中英

在mongoDB中索引大型数组

[英]indexing large array in mongoDB

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

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

多键解决方案如下所示:

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

index: createIndex({ contacts: 1 })

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

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

上载联系人列表时,两者的书写性能均较差:
第一个用于计算巨大的索引,第二个用于同时更新大量文档。
有更好的方法吗?
我正在使用具有两个辅助计算机的副本集,分片键可以帮助吗?

谢谢

为了索引保存数组值的字段,MongoDB为数组中的每个元素创建一个索引键。 这些多键索引支持对数组字段的有效查询 因此,如果我是您,我的数据模型将如下所示:

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

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

为了提高索引性能,您可以使其在后台构建而没有任何问题,对于副本集, 这是这样做的。

对于分片 ,这将无济于事,因为您甚至无法分片任何东西,因为您的集群中只有一个主节点。 分片至少需要2套主要的Mongo实例,因此,在您的情况下,您可以添加第四个服务器,然后有两个副本集,一个主副本和一个辅助副本,然后对其进行分片,然后将系统转换为2个复制的分片。

一旦实现这一目标,显然,即使在MongoDB中要处理的文档并不多,也可以平衡两个分片之间的负载。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM