MongoDB中唯一的多键哈希索引

时间:2018-08-22 15:57:24

标签: mongodb indexing pymongo

我有一个包含数十亿文档的集合,并且需要为文档的每个属性创建唯一的多键索引。

问题是,如果尝试这样做会出现错误,因为生成的密钥太大。

  

pymongo.errors.OperationFailure:WiredTigerIndex :: insert:密钥太大而无法索引,失败

我发现MongoDB可以让您创建hashed indexes,这可以解决此问题,但是它们不能用于多键索引。

我该如何解决?


我的第一个想法是为每个文档创建另一个属性,并为其属性的每个值散列,然后在该新字段上创建索引。
但是,这意味着每次我希望添加新属性时都要重新计算哈希,再加上创建哈希和索引所需的过多时间。

1 个答案:

答案 0 :(得分:1)

此功能是自2.6起在mongoDB中添加的一项功能,可防止索引条目的总大小超过1024个字节(也称为Index Key Length Limit)。

  

在MongoDB 2.6中,如果尝试插入或更新文档以使索引字段的值长于“索引键长度限制”,则该操作将失败并将错误返回给客户端。在MongoDB的早期版本中,这些操作将成功插入或修改文档,但一个或多个索引将不包含对该文档的引用。

出于迁移目的和其他临时情况,您可以将本用例降级为2.4处理,其中不会通过设置以下mongoDB服务器标志来触发此异常:

db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )

但是不建议这样做。

还请考虑为文档的每个属性创建索引可能根本不是最佳解决方案。

您是否检查过查询文档的方式以及键入的字段?您是否使用过explain来查看查询计划?如果您告诉我们您始终在所有字段上进行查询,则该规则将是一个例外。

Here are the recommended MongoDB indexing strategies

Excessive indexing has a price as well and should be avoided