根据我的需要,我必须进行预分割,但我的分片键是复合键。我的复合键(k1和k2)的两个键都是int,我想要的块结构是这样的
chunk1:k1 = minkey为1,k2 = minkey到maxkey
chunk2:k1 = 1到2,k2 = minkey到maxkey
chunk3:k1 = 2到3,k2 = minkey到maxkey
chunk4:k1 = 3到4,k2 = minkey到maxkey ...
所以我真正想做的是仅拆分第一把钥匙并留下第二把钥匙以包括所有可能的范围但是如果运行这个
db.runCommand( { split : "db.mycollection" , middle : { k1: 1} } );
它将无法提供完整的分片键,因此它让我调用此
db.runCommand( { split : "db.mycollection" , middle : { k1: 1, k2:somenumber } } );
这个命令有效,但结果分裂很糟糕,因为它给了我下面的块
chunk1:k1 = minkey为1,k2 = minkey to somenumber
chunk2:k1 = 1到maxkey,k2 = somenumber到maxkey
这很糟糕,因为如果用户插入某个文件,其中k1< 1和k2> somenumber,则系统中没有覆盖它的块,插入应该失败。
如何使用复合键创建这样的块边界?
注意:有人可能会问为什么我有k2,如果它总是minkey到maxkey。我有这样的k2,如果需要的话,允许在将来进一步拆分k2用于相同的k1(并且我确信在一些块上需要它)
答案 0 :(得分:0)
这应该这样做:
db.runCommand( { split : "db.mycollection" , middle : { k1: 1, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 2, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 3, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 4, k2:MaxKey } } );
顺便说一下,你永远不能创建一个区块没有覆盖某个范围的情况,因为你所做的只是分割现有的范围。另请注意,k2技术上不能从MinKey到MaxKey。第一个块的范围是{k1: MinKey, k2: MinKey}
到{k1:1, k2: MaxKey}
。下一个将是{k1: 1, k2: MaxKey}
到{k1:2, k2: MaxKey}
,依此类推