对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

moveRange(数据库命令)

moveRange

6.0版本新增。

Moves ranges between shards. Run the moveRange command with a mongos instance while using the admin database.

提示

In mongosh, this command can also be run through the sh.moveRange() helper method.

Helper methods are convenient for mongosh users, but they may not return the same level of information as database commands. In cases where the convenience is not needed or the additional return fields are required, use the database command.

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

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

注意

所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令

该命令具有以下语法:

db.adminCommand(
{
moveRange: <namespace>,
toShard: <ID of the recipient shard>,
min: <min key of the range to move>, // conditional
max: <max key of the range to move>, // conditional
forceJumbo: <bool>, // optional
writeConcern: <write concern>, // optional
secondaryThrottle: <bool> // optional
}
)

该命令接受以下字段:

字段
类型
说明

toShard

字符串

接收分片的 ID。

min

key

要移动范围的最小键。 如果不指定max ,则为必填项。

如果未指定min ,则给定数据段C ,其中maxC的独占上边界或C包含分片键max ,则min通过以下方式确定:

  • 如果min(C)max之间范围的数据大小小于每个collection的数据块大小或默认数据块大小,则选择该数据块的min值,因为min = min(C)

  • 否则,键min > min(C) ,其中min取决于配置的数据块大小。

max

key

要移动范围的最大键。 如果不指定min ,则为必填项。

如果不指定max ,则给定包含分片键min的数据块C ,则按以下方式确定max

  • 如果minmax(C)之间范围的数据大小小于每个collection的数据块大小或默认数据块大小,则选择该数据块的最大值为max = max(C)

  • 否则,密钥max < max(C) ,其中max取决于配置的数据块大小。

布尔

可选。

确定命令是否可以移动过大而无法迁移的范围的标志。 该范围可能会也可能不会标记为jumbo。

  • 如果为true ,则该命令可以移动范围。

  • 如果为false ,则该命令无法移动范围。

默认为 false

警告:

附带 forceJumbo=truemoveRange 命令会阻止集合上的写入操作。

此选项会导致分片迁移数据段,即使数据段大于配置的数据块大小。 在迁移期间,该集合仍然不可写入。

要在没有这么长的阻塞期的情况下迁移这些大数据段,请参阅平衡超出大小限制的范围

writeConcern

文档

secondaryThrottle

布尔

可选。

  • 如果true ,则数据块迁移期间的每个文档移动都会传播到至少一个从节点,然后负载均衡器才会继续处理下一个文档。这相当于{ w: 2 }的写关注(write concern)。

    使用writeConcern选项指定不同的写关注(write concern)。

  • 如果为false ,负载均衡器不会等待复制到从节点,而是继续处理下一个文档。

有关更多信息,请参阅辅助限制。

范围迁移部分描述了范围如何在 MongoDB 上的分片之间移动。

Only use the moveRange in scenarios like:

  • 初始数据摄取

  • 大批量导入操作

在大多数情况下,允许负载均衡器在分片集群中创建和平衡范围。

以下示例使用具有以下内容的collection:

  • 片键 x

  • 已配置数据块大小为 128 MB

  • 有边界的数据块: [x: 0, x: 100)

下表列出将minmax设置为各种值的结果:

min
max
结果

0

100

将范围内的所有文档移至接收分片。

10

30

创建三个子范围:

  • [x: 0, x: 10)

  • [x: 10, x: 30)

  • [x: 30, x: 100)

[x: 10, x: 30)中的所有文档移至接收分片。

0

20

创建两个子范围:

  • [x: 0, x: 20)

  • [x: 20, x: 100)

[x: 0, x: 20)中的所有文档移至接收分片。

40

100

创建两个子范围:

  • [x: 0, x: 40)

  • [x: 40, x: 100)

[x: 40, x: 100)中的所有文档移至接收分片。

下表列出了将min设置为各种值的结果:

min
键范围内的数据量
结果

0

x: 0x: 100之间包含的大小小于 128 MB。

将范围内的所有文档移至接收分片。

10

x: 0x: 100之间包含的大小小于 128 MB。

创建两个子范围:

  • [x: 0, x: 10)

  • [x : 10, x: 100)

[x: 10, x: 100)中的所有文档移至接收分片。

10

x: 10x: 30之间包含 128 MB。

创建三个子范围:

  • [x: 0, x: 10)

  • [x: 10, x: 30)

  • [x: 30, x: 100)

[x: 10, x: 30)中的所有文档移至接收分片。

下表列出了将max设置为各种值的结果:

max
键范围内的数据量
结果

100

x: 0x: 100之间包含的大小小于 128 MB。

将范围内的所有文档移至接收分片。

10

x: 0x: 100之间包含的大小小于 128 MB。

创建两个子范围:

  • [x: 0, x: 10)

  • [x : 10, x: 100)

[x: 0, x: 10)中的所有文档移至接收分片。

30

x: 10x: 30之间包含 128 MB。

创建三个子范围:

  • [x: 0, x: 10)

  • [x: 10, x: 30)

  • [x: 30, x: 100)

[x: 10, x: 30)中的所有文档移至接收分片。