我有一个包含数十亿文档的集合,并且需要为文档的每个属性创建唯一的多键索引。
问题是,如果尝试这样做会出现错误,因为生成的密钥太大。
pymongo.errors.OperationFailure:WiredTigerIndex :: insert:密钥太大而无法索引,失败
我发现MongoDB可以让您创建hashed indexes,这可以解决此问题,但是它们不能用于多键索引。
我该如何解决?
我的第一个想法是为每个文档创建另一个属性,并为其属性的每个值散列,然后在该新字段上创建索引。
但是,这意味着每次我希望添加新属性时都要重新计算哈希,再加上创建哈希和索引所需的过多时间。
答案 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。