2014-10-22 2 views
3

MongoDB рекомендует все операции update() для подсвеченной коллекции, которые определяют параметр 'multi:false', должны включать ключ осколка в условии запроса, чтобы запрос попадал только в конкретный кластер клана. Если ни одна клавиша осколок не найдено и 'multi:false', он возвращает эту ошибку (см http://docs.mongodb.org/manual/core/sharded-cluster-query-router/):Обновление MongoDB с соответствующим ключом осколка и множественным = истинным

update does not contain _id or shard key for pattern 

Я переключение мой код использовать sharded коллекцию. Мой код использует update() с 'multi:true' по умолчанию, и я не хочу изменять этот параметр по умолчанию, чтобы избежать любой потенциальной ошибки выше. Мой вопрос: если я включу ключ осколка в update() с 'multi:true', будут ли монгоры достаточно умными, чтобы перенаправить запрос на конкретный кластер с помощью ключа осколка и проигнорировать 'multi: true'?

EDIT: Оформить заказ этих кодов, что подтверждает то, что сказал @wdberkeley.

Версия 2.4:

https://github.com/mongodb/mongo/blob/v2.4/src/mongo/s/strategy_shard.cpp#L941

Версия 2.6:

https://github.com/mongodb/mongo/blob/v2.6/src/mongo/s/chunk_manager_targeter.cpp#L250

ответ

2

Да. Если у вас есть ключ осколка в запросе, как

> db.myShardedCollection.update({ "shardKey" : 22, "category" : "frogs" }, { "$set" : { "category" : "amphibians" } }, { "multi" : true }) 

затем mongos можно использовать клавишу осколка, чтобы направить обновление только осколок, ключ диапазон включает в себя значение 22. Независимо от того обновления 1 документ или 1000, все документы, задетые shardkey = 22, так что все будут найдены на на осколке, чей диапазон содержит 22. Это также будет работать в случае запроса диапазона, как

> db.myShardedCollection.update({ "shardKey" : { "$gte" : 22 }, "category" : "frogs" }, { "$set" : { "category" : "amphibians" } }, { "multi" : true }) 

для ключей Хешированного шарда кроме.

+0

Спасибо @wdberkeley. Не могли бы вы подтвердить, что это будет работать для версий mondodb 2.6 и 2.4? – anhlc

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