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
mongodb分片集群报couldn`t find valid index for shard key
这里能看到几个比较关键的点

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

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

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


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