mongodb - MongoDB中唯一的多键哈希索引
问题描述
我有一个包含数十亿文档的集合,需要为文档的每个属性创建一个唯一的多键索引。
问题是,如果我尝试这样做,我会得到一个错误,因为生成的密钥太大了。
pymongo.errors.OperationFailure:WiredTigerIndex::insert:键太大而无法索引,失败
我发现 MongoDB 允许您创建散列索引,这可以解决这个问题,但是它们不能用于多键索引。
我该如何解决这个问题?
我的第一个想法是为我的每个文档创建另一个属性,其中包含其属性的每个值的哈希值,然后在该新字段上创建一个索引。
然而,这意味着每次我希望添加一个新属性时都要重新计算哈希,加上创建哈希和索引所需的过多时间。
解决方案
这是 mongoDB 自 2.6 以来添加的一项功能,以防止索引条目的总大小超过 1024 字节(也称为索引键长度限制)。
在 MongoDB 2.6 中,如果您尝试插入或更新文档以使索引字段的值长于 Index Key Length Limit,则操作将失败并向客户端返回错误。在以前版本的 MongoDB 中,这些操作会成功插入或修改文档,但索引或索引不会包含对文档的引用。
出于迁移目的和其他临时场景,您可以降级到 2.4 处理此用例,其中通过设置此 mongoDB 服务器标志不会触发此异常:
db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )
但是,不建议这样做。
还要考虑为文档的每个属性创建索引可能根本不是最佳解决方案。
您是否检查过您如何查询您的文档以及您在哪些字段上键入?有没有用explain查看查询计划?如果您告诉我们您一直在查询所有字段,则该规则将是一个例外。
推荐阅读
- typescript - 通过 Play 商店与付款集成的 Ionic 应用程序
- python-3.x - 如何有条件地更新以前的迭代器附加值?
- python-3.x - 如何在不将错误处理写入函数的情况下创建自定义错误处理类
- python - masonite 'Post' 对象没有属性 'controller'
- python - 如何将字符串作为字典中的键传递
- fragmentpageradapter - onLoadFinished() 没有被调用,但 onCreateLoader() 被调用
- python - How to fix PackageNotFoundError for exe files
- javascript - 根据 Google 日历资源可用性更改 DOM
- python-3.x - 使用路由、视图和 GET 参数的 Python 3 + Flask 应用程序
- node.js - 如何在 node.js 中使用 redis?