在sh.splitAt()中使用$ regex进行MongoDb分片

时间:2017-12-19 19:26:44

标签: mongodb sharding

sh.splitAt()的文档对查询没有限制,那么为什么会导致错误:

db.cases.createIndex({"code":1},{unique:true})
sh.shardCollection("casemanagement.cases",{"code":1})
sh.splitAt("casemanagement.cases",{code:{$regex:/...........[4-6]./}})

错误:

new split key {code:{$regex:/...........[4-6]./} is not valid for shard key pattern code {1.0}

我发现的相关3.4源是 cluster_split_cmd.cpp 第228行, shard_key_pattern_test.cpp 。为什么ShardKeyPattern关心值侧,因为“code”是分片键?

2 个答案:

答案 0 :(得分:0)

MongoDB分片基于块分割。每个块都有其定义的最大键和最小键范围。因此,仅仅接受一系列值而不是正则表达式模式,分裂并不奇怪。我同意这应记录在sh.splitAt()

答案 1 :(得分:0)

我现在明白了什么sh.splitAt()确实做了以及如何最好地记录它:

  

sh.splitAt(名称空间,查询) 将分片拆分为单个 - 一个标识一个且只有一个文档的查询当前集合中可能存在或可能不存在,将所有文档超出移动到新块。

我正在寻找的功能可以表征为以下不存在的功能:

  

sh.cull(名称空间,过滤器) 使用过滤查询划分分片,其中查询选择的文档被移动到新的块,而不是那些由当前块中的查询选择。