On this page
split
在本页面
Definition
split
split命令使用以下格式:
db.adminCommand( { split: <database>.<collection>,
<find|middle|bounds> } )
split命令获取包含以下字段的文档:
Field | Type | Description |
---|---|---|
split |
string | chunk所在的collection的名称。指定集合的完整namespace,包括数据库名称。 |
find |
document | 在分片键上指定相等匹配的查询语句。匹配选择包含指定文档的块。您只能指定以下之一:find ,bounds 或middle 。 |
您不能对空集合使用find
选项。
| bounds
| array |版本 2.4 中的新增功能:要分割的块的边界。 bounds
适用于使用哈希分片键分区的集合中的块。参数的数组必须由两个文档组成,这些文档指定块的上下分片键值。这些值必须与现有块的最小值和最大值匹配。仅指定以下一项:find
,bounds
或middle
。
您不能对空集合使用bounds
选项。
| middle
| document |用作创建两个块的分割点的文档。 split需要以下选项之一:find
,bounds
或middle
。
Considerations
与find
或bounds
选项一起使用时,split命令沿中位数拆分块。因此,该命令不能使用find
或bounds
选项拆分空块,因为空块没有中间值。
要创建空块拆分,请在split命令中使用middle
选项或在splitAt
命令中使用。
Command Formats
要创建块拆分,请连接到mongos实例,然后向admin
数据库发出以下命令:
db.adminCommand( { split: <database>.<collection>,
find: <document> } )
Or:
db.adminCommand( { split: <database>.<collection>,
middle: <document> } )
Or:
db.adminCommand( { split: <database>.<collection>,
bounds: [ <lower>, <upper> ] } )
要为使用哈希分片键的集合创建拆分,请使用bounds
参数。 请勿为此目的使用middle
参数。
Warning
在分片集合中拆分数据以创建新块时,请务必小心。在分片具有现有数据的集合时,MongoDB 会自动创建块以均匀地分布该集合。为了在分片群集中有效地拆分数据,必须考虑一个块中的文档数和平均文档大小才能创建统一的块大小。当块的大小不规则时,碎片可能具有相同数量的块,但数据大小却大不相同。避免创建导致集合大小不同的集合的拆分。
See also
Examples
以下各节提供了split命令的示例。
切成两半
db.adminCommand( { split : "test.people", find : { _id : 99 } } )
split命令标识test
数据库的people
集合中的块,该块中包含与{ _id : 99 }
匹配的文档。 split不需要存在匹配项即可识别适当的块。然后,该命令将其拆分为两个大小相等的块。
Note
split按范围(而不是大小)创建两个相等的块,并且不使用所选点作为新块的边界
定义任意分割点
要定义任意分割点,请使用以下形式:
db.adminCommand( { split : "test.people", middle : { _id : 99 } } )
split命令标识test
数据库的people
集合中的块,该块将容纳与查询{ _id : 99 }
匹配的文档。 split不需要存在匹配项即可识别适当的块。然后,该命令将其拆分为两个大块,并将匹配的文档作为拆分大块之一的下限。
此格式通常用于集合中的pre-splitting数据。
使用哈希分片键的值分割块
本示例使用test
数据库的people
集合中的哈希分片键 userid
。以下命令使用包含两个单字段文档的数组来表示用于拆分块的哈希分片键的最小值和最大值:
db.adminCommand( { split: "test.people",
bounds : [ { userid: NumberLong("-5838464104018346494") },
{ userid: NumberLong("-5557153028469814163") }
] } )
Note
MongoDB 使用 64 位NumberLong类型表示哈希值。
使用sh.status()查看分片键的现有范围。
元数据锁定错误
如果另一个进程(例如平衡器进程)在split运行时更改了元数据,则可能会看到metadata lock error
。
errmsg: "The collection's metadata lock is already taken."
此消息表明拆分失败,没有副作用。重试split命令。