anh*_*hlc 5 sharding mongodb mongodb-query
MongoDB建议update()对分片集合进行所有操作,这些操作指定'multi:false'选项必须在查询条件中包括分片键,这样查询将仅命中特定的分片集群。如果没有找到shard键'multi:false',则会返回此错误(请参见http://docs.mongodb.org/manual/core/sharded-cluster-query-router/):
update does not contain _id or shard key for pattern
Run Code Online (Sandbox Code Playgroud)
我正在切换代码以使用分片集合。我的代码默认情况下使用update()with 'multi:true',并且我不想更改该默认选项以避免上面的任何潜在错误。我的问题是,如果我在update()with中包含分片键'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
是的。如果查询中有分片键,例如
> db.myShardedCollection.update({ "shardKey" : 22, "category" : "frogs" }, { "$set" : { "category" : "amphibians" } }, { "multi" : true })
Run Code Online (Sandbox Code Playgroud)
那么 mongos 可以使用分片键将更新定向到键范围包含值 22 的分片。无论更新 1 个文档还是 1000 个文档,所有受影响的文档都会shardkey = 22在范围包含 22 的分片上找到。也适用于范围查询的情况,例如
> db.myShardedCollection.update({ "shardKey" : { "$gte" : 22 }, "category" : "frogs" }, { "$set" : { "category" : "amphibians" } }, { "multi" : true })
Run Code Online (Sandbox Code Playgroud)
除了散列分片键。