Что особенного в восстановлении БД в сегментированном кластере MongoDB?
Я хотел бы перенести базу данных из набора реплик в другую, принадлежащую сегментированному кластеру. До сих пор этот кластер имеет только 1 осколок, и ни одна коллекция или база данных на самом деле не осколочные.
Я монодубил и восстановил эту БД. С одного из монго закрытого кластера я могу выполнить простой запрос, например find(), но что-то, включающее проекцию, подобную следующей, больше не работает:
"find ({" var1 ": subvar}, {" _ id ": 0," fld1 ": 1," fld2 ": 1," fld3 ": 1}). limit (1).sort (" _ id ", pymongo.DESCENDING)"
Я получаю следующее сообщение об ошибке:
ошибка базы данных: необходимо иметь ключ сортировки в проекции и удалить его
Это должно быть проблемой, связанной с сегментированием, потому что я восстановил эту БД на автономном сервере mongodb dev, и тест успешно прошел.
Заранее спасибо,
Грег.
1 ответ
Это не проблема с Mongorestore. Если вы создадите новую коллекцию в изолированной базе данных в версии 2.2+, вы увидите то же самое поведение.
mongos> db.version()
2.2.6
mongos> db.foo.save({id:3, value:'c'})
mongos> db.foo.save({id:2, value:'b'})
mongos> db.foo.save({id:1, value:'a'})
mongos> db.foo.find({}, {id:0}).sort({id:1})
error: {
"$err" : "have to have sort key in projection and removing it",
"code" : 13431
}
Видимо поведение было другим в 2.0.
mongos> db.version()
2.0.9
mongos> db.foo.save({id:3, value:'c'})
mongos> db.foo.save({id:2, value:'b'})
mongos> db.foo.save({id:1, value:'a'})
mongos> db.foo.find({},{id:0}).sort({id:1})
{ "_id" : ObjectId("523bd35dff9a7c468936efba"), "value" : "a" }
{ "_id" : ObjectId("523bd358ff9a7c468936efb9"), "value" : "b" }
{ "_id" : ObjectId("523bd352ff9a7c468936efb8"), "value" : "c" }
Я открыл SERVER-10381, чтобы увидеть, ожидается ли это, если вы хотите следовать ему.
РЕДАКТИРОВАТЬ: Это ожидается. Когда запрос выполняется через mongos, ключ, как ожидается, будет существовать, так что результаты отдельных сегментов могут быть объединены и отсортированы. До 2.2 логика для отдельного набора осколков / неосколенных была, по-видимому, иной, но она была изменена для согласованности.
Документация будет обновлена, чтобы отразить его ограничение.