Рассмотрим : у меня есть коллекция "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"
}
Не уверен, что здесь не так. Кто-нибудь может пролить свет на это?
PS : чтобы стратегия индекса была такой же, как стратегия шарда, попробуйте тот же ключ шарда в пустой коллекции и скопируйте индекс, созданный для поддержки ключа шарда, и повторно попытался собрать коллекцию в тех случаях, когда данные существуют, но не повезло, они выдают ту же ошибку.
Дополнительная информация : Использование версий MongoDB: 4.2.2 кластер серверов конфигурации / набор реплик, 2 кластера шардов / серверы реплик при создании коллекции индекса / шарда были подключены к mongos
Наконец-то обнаружена причина root
новая коллекция, но не существующая, потому что в индексе создания есть опечатка [ s отсутствует: | ]. & однажды исправил ошибку получения опечатки как cannot index parallel arrays [toUsersRef] [toGroupsRef]