2014-09-18 2 views
1

Скажем, я установил минимальный и максимальный ключ для осколков, используя метку диапазона. Позже, я узнаю, что диапазон тегов, который я определил, не будет балансировать. Затем мне нужно изменить значение диапазона тегов.Диапазон обновления тегов на осколке диапазона MongoDB

У меня есть поиск в документах MongoDB, упоминается только добавление и удаление тегов, нет упоминания о значении диапазона изменения/изменения тега.

Тогда я сделать некоторый эксперимент путем обновления значения в БД сбор конфигурации осколке

mongos> db.tags.find() 
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 1 } }, "ns" : "test.lab.range", "min" : { "_id" : 1 }, "max" : { "_id" : 100 }, "tag" : "rangeTime1" } 
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 100 } }, "ns" : "test.lab.range", "min" : { "_id" : 100 }, "max" : { "_id" : 200 }, "tag" : "rangeTime2" } 
mongos> db.tags.update({_id:{ "ns" : "test.lab.range", "min" : { "_id" : 100 } }},{$set:{min : {_id : 150}}}) 
mongos> db.tags.update({_id:{ "ns" : "test.lab.range", "min" : { "_id" : 1 } }},{$set:{max : {_id : 150}}}) 
mongos> db.tags.find() 
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 1 } }, "ns" : "test.lab.range", "min" : { "_id" : 1 }, "max" : { "_id" : 150 }, "tag" : "rangeTime1" } 
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 100 } }, "max" : { "_id" : 200 }, "min" : { "_id" : 150 }, "ns" : "test.lab.range", "tag" : "rangeTime2" } 

Это хорошо работает, но теги идентификатор не обновляется. Обратите внимание, что даже когда min обновляется до 150 в диапазонеTime2, идентификатор не обновляется, что делает сбор тегов непоследовательным.

Это своего рода грязный, но, к сожалению, это работы.

Это правильный способ обновления диапазона тегов? Есть ли другие лучшие способы?

+0

Опять же, это вопрос для http://DBA.stackexchange.com –

ответ

3

Это не очевидно, но если вы запустите sh.addTagRange() с тем же минимумом (в вашем случае, 1 или 100) и другим максимумом, тогда существующий диапазон тегов с этим минимальным значением изменится, по существу функционируя как на месте обновление (addTagRange() помощника в основном запускает upsert на основе поля _ID и с некоторым здравомыслием проверки), которую можно увидеть, запустив его без скобок:

mongos> sh.addTagRange 
function (ns, min, max, tag) { 
    if (bsonWoCompare(min, max) == 0) { 
     throw new Error("min and max cannot be the same"); 
    } 

    var config = db.getSisterDB("config"); 
    config.tags.update({_id: { ns : ns , min : min } } , 
      {_id: { ns : ns , min : min }, ns : ns , min : min , max : max , tag : tag } , 
      true); 
    sh._checkLastError(config); 
} 

Чтобы изменить минимальный диапазон тега, это не будет работать - вам необходимо удалить и повторно добавить, или вам необходимо вручную обновить поле _id.min в поддоку, а также поле min в p, чтобы избежать несогласованности, которую вы видите. Я бы рекомендовал удалить и повторно добавить вариант в настоящее время, чтобы избежать путаницы. Эти команды должны быть реорганизованы в более поздней версии (еще не запланированы), и я лично добавил нового помощника удаления как часть SERVER-6352, чтобы сделать это немного менее обременительным в будущем.

Смежные вопросы