mongodb分片集群报couldn`t find valid index for shard key

环境:mongodb 4.4.1,三副本三shard的分片集群
问题:对一个已存在的集合(>2000w数据)进行分片,创建分片索引之后执行
sh.shardCollection("data_platform.mongo_api_user_info",{client_id:"hashed"})
报错,分片不成功,提示
couldn't find valid index for shard key
在这里插入图片描述
这里能看到几个比较关键的点

  • 分片键已经创建索引,索引类型是hashed,分片模式也是hashed
  • 该索引的索引名叫idx_client_id

尝试多种方法之后始终不能开启分片,删索引,删表都无济于事,然后突发奇想我要是给一个不存在的字段加索引会怎么样
在这里插入图片描述
很明显,报错信息不一样,现在提示需要创建一个索引,但是这句话中还透露了一个非常关键的信息:start with proposed shard key
接下来把索引改名,由idx_client_id改成client_id_idx
在这里插入图片描述
再次执行语句,奇迹发生了!!!
在这里插入图片描述

综上,折腾了我一天之后,可以得出一个结论: 用作分片键的索引名必须以分片键字段名打头


为了确认是不是巧合,我把mongodb 4.4.1的源代码下载了下来,源码是C++写的,读起来比较费劲,不过直接搜索报错提示就能很快找到对应的方法,然后
在这里插入图片描述
254行,实在是无力吐槽了,这么重要的信息在官方文档上完全查询不到,百度搜只有一条结果,google之也仅有一页多点,而且也没人提到这个这个最关键的地方。尚不知道开发团队这么做的用意是什么。
代码位置在mongo-r4.4.1\src\mongo\db\catalog\index_catalog.h
无力吐槽。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值