使用匹配的分片键和multiple = true进行MongoDB更新

时间:2014-10-22 00:25:38

标签: mongodb mongodb-query sharding

MongoDB建议对指定update()选项的分片集合的所有'multi:false'操作必须在查询条件中包含分片键,以便查询仅命中特定的分片群集。如果找不到分片键并且'multi:false',则会返回此错误(请参阅http://docs.mongodb.org/manual/core/sharded-cluster-query-router/):

update does not contain _id or shard key for pattern

我正在切换我的代码以使用分片集合。我的代码默认使用update()'multi:true',我不想更改默认选项以避免上述任何潜在错误。我的问题是,如果我将分片密钥包含在update() 'multi:true'中,那么mongos是否足够聪明,可以使用分片键将查询路由到特定群集并忽略'multi: true'

编辑: 查看这些代码,确认@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

1 个答案:

答案 0 :(得分:3)

是。如果查询中有分片键,例如

> 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 })

除了散列的分片键。