mongodb ShardCollection失败,出现错误“couldn't find valid index for shard key”& code:“九六”及

wgeznvg7  于 2023-04-05  发布在  Go
关注(0)|答案(1)|浏览(279)

考虑:我有一个名为“Feeds”,“Groups”和“Users”的集合,其中有数百万个文档。假设“Feeds”模式如下:

{
    fromUserRef: <Reference Id from Users collection>,
    toUsersRef: [<Array of Reference Id(s) from Users collection>],
    toGroupsRef: [<Array of Reference Id(s) from Groups collection>],
    text: <String>,
    image: <String>,
    ...
}

样本文档:

{
    fromUserRef: ObjectId("5dd4e8b52355555592249596"),
    toUsersRef: [],
    toGroupsRef: [ObjectId("5dd4e8b523594c5592249392")],
    ...
},
{
    fromUserRef: ObjectId("5dd4e8b52355555592249583"),
    toUsersRef: [ObjectId("5dd4e8b52355555592249596"), ObjectId("5dd4e8b52355555592249291")],
    toGroupsRef: [],
    ...
},
{
    fromUserRef: ObjectId("5dd4e8b52355555592249583"),
    toUsersRef: [],
    toGroupsRef: [],
    ...
}

现在假设我选择了带有“toUsersRef”和“toGroupsRef”的分片密钥。根据官方文档,必须有一个索引支持分片密钥。
在我的例子中,我创建了一个index如下:

db.feeds.createIndex({ 
    "toUserRef" : 1,
    "toGroupsRef" : 1
},
{"name":"toUsersRef_1_toGroupsRef_1"})

分片集合:

sh.shardCollection("my_db.feeds", {
    "toUsersRef" : 1,   "toGroupsRef" : 1
 });

错误输出:

{
   "message" : "couldn't find valid index for shard key",
   "ok" : 0,
   "code" : 96,
   "codeName" : "OperationFailed",
   "operationTime" : "Timestamp(1578373028, 5)",
   "$clusterTime" : {
       "clusterTime" : "Timestamp(1578373028, 5)",
       "signature" : {
           "hash" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=",
           "keyId" : 0
       }
   },
   "name" : "MongoError"
}

不知道这里出了什么问题。谁能把灯照一下吗?

P.S:为了使索引策略必须与分片策略相同,尝试在空集合上使用相同的分片键,并复制为支持分片键而创建的索引,并重新尝试在数据存在的地方分片集合,但没有运气,它抛出了相同的错误。
更多信息:使用MongoDB版本:4.2.2配置服务器集群/副本集,创建索引/分片集合时连接到mongos的2个分片集群/副本服务器
终于找到根源了

它正在处理新集合,但没有处理现有集合,因为创建索引中有一个错字[s丢失:|]. & once corrected the typo getting error as cannot index parallel arrays [toUsersRef] [toGroupsRef]

pdtvr36n

pdtvr36n1#

分片键索引不能是多键(即索引的字段不能是数组)。

相关问题