Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

拆分

在此页面上

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

将分 分片集群 中的 数据段 数据块 为两个数据段。分片根据其维护的数据数据块大小统计信息管理和分割数据段。

在特殊情况下, split命令允许管理员手动创建分割。 有关这些情况以及包装 的 命令的信息,请参阅 在分片集群中分割MongoDBshell split数据段。

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

提示

mongosh 中,该命令也可以通过 sh.splitAt()sh.splitFind() 辅助函数运行。

辅助方法对 mongosh 用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。

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

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

重要

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

该命令具有以下语法:

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

该命令接受以下字段:

字段
类型
说明
split
字符串
数据块 所在 collection 的名称 。指定集合的完整命名空间,包括数据库名称。
find
文档

一个在分片键上指定等值匹配的查询声明。匹配会选择包含指定文档的数据块。您只能指定以下内容之一: findboundsmiddle

不能在空collection上使用find选项。

bounds
阵列

bounds 适用于使用哈希分片键分区的collection中的数据块。该参数的数组必须由两个文档组成,这两个文档分别指定数据块的下限和上限分片键值。这些值必须与现有数据块的最小值和最大值相匹配。仅指定以下之一: findboundsmiddle

不能在空collection上使用bounds选项。

middle
文档
用作创建两个数据段分割点的文档。 split需要以下选项之一: findboundsmiddle

findbounds选项一起使用时, split命令会沿中位数分割数据段。 因此,该命令不能使用findbounds选项来分割空数据段,因为空数据段没有中位数。

要在空数据段中创建分割,请将middle选项与split命令一起使用或使用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> ] } )

要为使用哈希分片键的collection创建分割,请使用bounds参数。请勿middle参数用于此目的。

警告

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

提示

另请参阅:

下文将举例说明 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不要求存在匹配项来识别适当的数据段。 然后,该命令将其拆分为两个数据段,并将匹配的文档作为其中一个拆分数据段的下限。

这种形式通常在预分片collection中的数据时使用。

此示例使用database的collection集合中的 哈希分片键 。useridpeopletest以下命令使用一个包含两个单字段文档的数组来表示哈希分片键的最小值和最大值,以分割数据段:

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

注意

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

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

如果另一个进程(例如负载均衡器进程)在split运行时更改元数据,您可能会看到metadata lock error

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

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

后退

shardingState