Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB update with matching shard key and multiple=true

MongoDB recommends all update() operations for a sharded collection that specify the 'multi:false' option must include the shard key in the query condition so the query will hit only a specific shard cluster. If no shard key found and 'multi:false', it returns this error (See http://docs.mongodb.org/manual/core/sharded-cluster-query-router/):

update does not contain _id or shard key for pattern

I am switching my code to use a sharded collection. My code is using update() with 'multi:true' by default and I don't want to change that default option to avoid any potential error above. My question is if I include the shard key in an update() with 'multi:true', will mongos be smart enough to route the query to the specific cluster using the shard key and ignore 'multi: true'?

EDIT: Checkout these codes, which confirms what @wdberkeley said.

Version 2.4:

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

Version 2.6:

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

like image 978
anhlc Avatar asked Sep 29 '22 14:09

anhlc


1 Answers

Yes. If you have the shard key in the query, like

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

then mongos can use the shard key to direct the update to just the shard whose key range includes the value 22. Whether updating 1 document or 1000, all the documents affected have shardkey = 22 so all will be found on on the shard whose range contains 22. This would also work in the case of a range query like

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

except for hashed shard keys.

like image 105
wdberkeley Avatar answered Oct 04 '22 02:10

wdberkeley