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
答案 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 })
除了散列的分片键。