Mongodb ShardCollection失败,出现错误“0”;不能';“找不到切分键的有效索引”&;代码:";96“&;

Mongodb ShardCollection失败,出现错误“0”;不能';“找不到切分键的有效索引”&;代码:";96“&;,mongodb,indexing,sharding,Mongodb,Indexing,Sharding,考虑一下: 我有一个名为“feed”、“Groups”和“Users”的集合,其中有数百万个文档。 表示“提要”模式如下所示: { fromUserRef: <Reference Id from Users collection>, toUsersRef: [<Array of Reference Id(s) from Users collection>], toGroupsRef: [<Array of Reference Id(s) fr

考虑一下: 我有一个名为“feed”、“Groups”和“Users”的集合,其中有数百万个文档。 表示“提要”模式如下所示:

{
    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>,
    ...
}
db.feeds.createIndex({ 
    "toUserRef" : 1,
    "toGroupsRef" : 1
},
{"name":"toUsersRef_1_toGroupsRef_1"})
现在假设我选择了带有“ToUserRef”和“toGroupsRef”的切分键。根据,必须有一个支持分片键的索引

在我的例子中,我创建了一个索引,如下所示:

{
    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>,
    ...
}
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"
}
错误输出:

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 配置服务器群集/副本集,2个碎片群集/副本服务器 创建索引/碎片集合时已连接到mongos


终于找到了根本原因


它正在处理新集合,但没有处理现有集合,因为创建索引中有一个输入错误[s丢失:|]&一旦更正了输入错误,因为
无法索引并行数组[ToUserRef][toGroupsRef]

您是否使用
sh.enableSharding()在数据库上启用了分片功能?此外,如果您遗漏了任何内容,请查看此内容:。@prasad_uu是的,已启用切分,正如我提到的,我使用相同的切分键创建了一个新集合,该集合位于相同的数据库中。使用相同的切分键创建新集合是什么意思…?您必须按照以下顺序执行以下步骤:(1)sh.enableSharding,(2)在要分片的集合上创建索引。(3)切分集合(sh.shardCollection)。新集合的意思是我用feedss(注意额外的's')创建空集合,然后用相同的键切分集合,即`“ToUserRef”:1,“toGroupsRef”:1`这将创建索引,对吗?我将该索引复制到存在数据的旧集合中,然后尝试切分集合,但也失败了。。