考虑:我有一个名为“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]
1条答案
按热度按时间pdtvr36n1#
分片键索引不能是多键(即索引的字段不能是数组)。