split

在本页面

Definition

split命令使用以下格式:

db.adminCommand( { split: <database>.<collection>,
                   <find|middle|bounds> } )

split命令获取包含以下字段的文档:

Field Type Description
split string chunk所在的collection的名称。指定集合的完整namespace,包括数据库名称。
find document 在分片键上指定相等匹配的查询语句。匹配选择包含指定文档的块。您只能指定以下之一:findboundsmiddle


您不能对空集合使用find选项。
| bounds | array |版本 2.4 中的新增功能:要分割的块的边界。 bounds适用于使用哈希分片键分区的集合中的块。参数的数组必须由两个文档组成,这些文档指定块的上下分片键值。这些值必须与现有块的最小值和最大值匹配。仅指定以下一项:findboundsmiddle
您不能对空集合使用bounds选项。
| middle | document |用作创建两个块的分割点的文档。 split需要以下选项之一:findboundsmiddle

Considerations

findbounds选项一起使用时,split命令沿中位数拆分块。因此,该命令不能使用findbounds选项拆分空块,因为空块没有中间值。

要创建空块拆分,请在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

moveChunksh.moveChunk()sh.splitAt()sh.splitFind(),它们包装了split的功能。

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命令。

首页