文档菜单
文档首页
/
MongoDB 手册
/ / /

split

本页内容

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 注意事项
  • 命令格式
  • 示例
  • 元数据锁定错误
split

数据分片分片集群中拆分为两个数据分片。分片根据它们维护的数据分片大小统计数据来管理和拆分数据分片。

在特殊情况下,split命令允许管理员手动创建拆分。有关这些情况以及包含split.

split命令必须在admin数据库中运行。

提示

mongosh中,此命令也可以通过sh.splitAt()sh.splitFind()辅助方法运行.

辅助方法对mongosh用户很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。

此命令在以下环境中托管的部署中可用

  • MongoDB Atlas:云中MongoDB部署的全托管服务

重要

此命令不支持在无服务器实例中使用。有关更多信息,请参阅不受支持的命令。

该命令有以下语法

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

命令接受以下字段

字段
类型
描述
split
字符串
存在数据集的名称。指定数据集的完整命名空间,包括数据库名称。
查找
文档

一个查询语句,用于指定对分片键的相等匹配。该匹配选择包含指定文档的块。您必须指定以下选项之一:findboundsmiddle

在空集合上不能使用find选项。

bounds
数组

bounds适用于使用哈希分片键进行分区的集合中的块。参数的数组必须包含两个文档,分别指定块的最低和最高分片键值。这些值必须匹配现有块的最低和最高值。指定以下选项之一:findboundsmiddle

在空集合上不能使用bounds选项。

middle
文档
用作创建两个块的分割点的文档。使用split时,需要以下选项之一:findboundsmiddle

当与findbounds选项一起使用时,split命令会在中值处分割块。因此,该命令不能使用findbounds选项来分割空块,因为空块没有中值。

要在空块中创建分割,请使用split命令的middle选项,或者使用sh.splitAt()命令。

要创建一个数据块分割,连接到mongos实例,并向admin数据库发出以下命令

db.adminCommand( { split: <database>.<collection>,
find: <document> } )

或者

db.adminCommand( { split: <database>.<collection>,
middle: <document> } )

或者

db.adminCommand( { split: <database>.<collection>,
bounds: [ <lower>, <upper> ] } )

要为使用散列分片键的集合创建分割,使用bounds参数。为此目的,不要使用middle参数。

警告

在分片集合中拆分数据以创建新数据块时要小心。当您对具有现有数据的集合进行分片时,MongoDB会自动创建数据块以均匀分布集合。为了在分片集群中有效地拆分数据,您必须考虑数据块中的文档数量和平均文档大小以创建均匀的数据块大小。当数据块大小不规则时,分片可能具有相同数量的数据块,但数据大小可能非常不同。避免创建导致集合具有不同大小数据块的分割。

提示

另请参阅

以下部分提供了split命令的示例。

db.adminCommand( { split : "test.people", find : { _id : 99 } } )

命令 split 识别 test 数据库中 people 集合中包含匹配 { _id : 99 } 的文档的数据块。命令 split 不需要存在匹配项来识别适当的块。然后命令将其分成两个大小相等的块。

注意

命令 split 通过范围而不是大小创建两个相等的块,并且不使用选定点作为新块的边界。

要定义一个任意的分割点,使用以下形式

db.adminCommand( { split : "test.people", middle : { _id : 99 } } )

命令 split 识别 test 数据库中 people 集合中将要包含匹配查询 { _id : 99 } 的文档的数据块。命令 split 不需要存在匹配项来识别适当的块。然后命令将其分成两个块,匹配文档作为其中一个分割块的底部边界。

此形式通常用于在集合中预分割数据。

此示例使用一个测试数据库中 people 集合的 哈希分片键 userid。以下命令使用一个包含两个单字段文档的数组来表示哈希分片键的最小和最大值,以拆分数据块

db.adminCommand( { split: "test.people",
bounds : [ { userid: NumberLong("-5838464104018346494") },
{ userid: NumberLong("-5557153028469814163") }
] } )

注意

MongoDB 使用 64 位的 NumberLong 类型来表示哈希值。

使用 sh.status() 查看现有分片键的范围。

如果另一个进程(如平衡器进程)在 split 运行时更改元数据,您可能会看到一个 元数据锁定错误

errmsg: "The collection's metadata lock is already taken."

此消息表示拆分失败,没有副作用。重试 split 命令。

返回

shardingState