首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >pymongo创建hash和text索引

pymongo创建hash和text索引

作者头像
不止于python
发布2022-05-31 20:03:31
发布2022-05-31 20:03:31
9070
举报
文章被收录于专栏:不止于python不止于python

报错中.......

在使用pymongo创建基础索引, 出现以下错误

代码语言:javascript
复制
pymongo.errors.OperationFailure: WiredTigerIndex::insert: key too large to index, failing

代码如下:

代码语言:javascript
复制
import pymongo

user_col = pymongo.MongoClient()["test"]["t"]
user_col.create_index("description")
user_col.insert_one({"age": 18, "description": "tests"*260})

google原因.......

这个是因为在MongoDB中,从2.6开始,索引项的总大小(根据BSON类型可能包括结构开销)必须小于1024字节。

就是要建立的索引字段的值特别大, 超过了1024字节, 对于比较大的值建立索引, 建立的索引也会非常大, 效率也会很慢, 占用更大的RAM空间, 所以不建议对较大的创建普通索引

关于mongo官方文档关于index key的限制

https://docs.mongodb.com/manual/reference/limits/#Index-Key-Limit

解决中......

1最简单方法

最简单也是最难的方法:

想办法减少字段值的大小, 不超过1024字节

2改变mongo配置

选择其一即可

1. 使用以下命令启动mongod

代码语言:javascript
复制
mongod --setParameter failIndexKeyTooLong=false

2. 在mongo中执行

代码语言:javascript
复制
db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )

3创建hash索引

建立hash索引

创建hash索引官方文档

https://docs.mongodb.com/manual/core/index-hashed/

代码语言:javascript
复制
Collection.create_index([("description", pymongo.HASHED)])

例:将创建索引改为

代码语言:javascript
复制
user_col.create_index([("description", pymongo.HASHED)])

进入mongo, 查看索引如下

代码语言:javascript
复制
> use test
    switched to db test
    > db.user.getIndexes()
    [
        {
            "v" : 2,
            "key" : {
                "_id" : 1
            },
            "name" : "_id_",
            "ns" : "test.user"
        },
        {
            "v" : 2,
            "key" : {
                "description" : "hashed"
            },
            "name" : "description_hashed",
            "ns" : "test.user"
        }
    ]

4创建text索引

注意 : text索引一个集合只能创建一个, 再次创建会报错

创建text索引官方文档

https://docs.mongodb.com/manual/core/index-text/

代码语言:javascript
复制
Collection.create_index([("description", pymongo.TEXT)])

只需要将pymongo.HASHED 改为 pymongo.TEXT 就可以了

代码语言:javascript
复制
 user_col.create_index([("description", pymongo.TEXT)])

再次查看db.user.getIndexes(), 会多出一个text索引:

代码语言:javascript
复制
{
        "v" : 2,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "description_text",
        "ns" : "test.user",
        "weights" : {
            "description" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 3
    }

到这里这个错误就被愉快的解决了, 有问题欢迎留言哦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档