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

sh.shardAndDistributeCollection()(mongosh方法)

sh.shardAndDistributeCollection(namespace, key, unique, options)

对集合进行分片,并立即使用提供的分分片键重新分发数据。 数据的立即重新分布可以加快数据移动速度,减少影响工作负载的影响。

重要

mongosh 方法

本页面提供 mongosh 方法的相关信息。这不是 特定于语言的驱动程序(例如 Node.js)的文档。

如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。

mongosh中运行sh.shardAndDistributeCollection()与连续运行shardCollectionreshardCollection命令具有相同的结果。

sh.shardAndDistributeCollection() 使用以下参数:

Parameter
类型
必要性
说明

namespace

字符串

必需

要分片的集合的命名空间,格式为"<database>.<collection>"

key

文档

必需

指定一个或多个字段用作分片键的文档。

{ <field1>: <1|"hashed">, ... }

将字段值设置为以下任一项:

另请参阅:分片键索引

unique

布尔

Optional

指定 true 以确保基础索引执行唯一约束。默认值为 false

使用哈希分片键时,不能指定true

options

文档

Optional

包含可选字段的文档,其中包括numInitialChunkscollation

options 参数支持以下选项:

Parameter
类型
说明

numInitialChunks

整型

指定对集合分片和重新分片时要在集群中所有分片上创建的初始数据块数。然后,MongoDB在集群中创建并均衡数据块。numInitialChunks 参数的结果必须小于每个分片的 8192。每个分片的默认数据块数为 90。

当分片键包含哈希前缀时,重新分片操作会忽略 numInitialChunks 设置。相反, MongoDB使用与为空哈希集合创建初始数据块相同的方法,确定性地在接收者之间分割哈希键空间。

collation

文档

如果指定给shardAndDistributeCollection()的集合具有默认排序规则,则必须包含具有{ locale : "simple" }的排序规则文档,否则shardAndDistributeCollection()方法将失败。

presplitHashedZones

布尔

指定 true 以基于为集合定义的区域和区域范围来执行空集合或不存在集合的初始数据段创建和分发。仅用于哈希分片

shardAndDistributeCollection()presplitHashedZones: true 返回错误,如果满足以下任一条件:

timeseries

文档

指定此选项可创建新的分片时间序列集合。

要对现有的时间序列集合进行分片,请省略此参数。

当指定给 shardAndDistributeCollection 的集合是时间序列集合并且未指定 timeseries 选项时,MongoDB 将使用定义现有时间序列集合的值来填充 timeseries 字段。

有关详细语法,请参阅时间序列选项。

以下因素可能会影响性能或数据分布。

虽然您可以稍后更改分片键,但请仔细考虑分分片键的选择,以优化可扩展性和性能。

对时间序列集合进行分片时,您只能为分片键指定以下字段:

  • 使用 metaField

  • 子字段 metaField

  • 使用 timeField

您可以在分片键中指定这些字段的组合。不允许在分片键模式中使用任何其他字段,包括 _id

在您指定分片键时:

提示

避免指定 timeField 作为分片键。由于 timeField单调增加的,因此,可能导致所有写入都出现在集群中的单个数据段上。理想情况下,数据均匀分布在数据段之间。

要了解如何最好地选择分片键,请参阅:

哈希分片键使用哈希索引复合哈希索引作为分片键。

要指定哈希分片键字段,请使用field: "hashed"

注意

如果在创建哈希分片键集合时正在进行块迁移,则初始块分布可能会不均匀,直到负载均衡器自动平衡集合。

分片集合操作(即 如果已为集合定义shardCollection 区域和区域范围sh.shardCollection() ,则 命令和 辅助程序)可以为空集合或不存在的集合执行初始数据数据块创建和分配。初始数据块分布可以更快地设置分区分片。 初始分配后,负载均衡器将数据块管理未来的数据段分配。

有关示例,请参阅为空集合或不存在的集合预定义区域和区域范围。 如果使用范围或单字段哈希分片键分片键对集合进行分片,并且已为集合定义了区域和区域范围,则numInitialChunks选项不起作用。

要使用复合哈希索引分片集合进行分片,请参阅使用复合哈希索引进行初始数据段分布。

MongoDB 支持使用组合哈希索引对集合进行分片。在使用组合哈希分片键对空集合或不存在的集合进行分片时,需要满足额外的要求,MongoDB 才能执行初始数据块创建和分配。

如果已为空集合定义区域和区域范围集合为false ,则numInitialChunks选项不起作用

有关示例,请参阅为空集合或不存在的集合预定义区域和区域范围。

如果指定unique: true ,则必须在使用sh.shardAndDistributeCollection()之前创建索引。

虽然可以具有以分分片键为 前缀 的唯一 复合索引 ,但如果使用unique 参数,则集合必须具有基于分分片键的唯一索引。

如果集合具有默认排序规则,则sh.shardAndDistributeCollection命令必须包含值为{ locale: "simple" }collation参数。 对于具有默认排序规则的非空集合,您必须至少拥有一个具有简单排序规则且其字段支持分分片键模式的索引。

无需为没有排序规则的集合指定 collation 选项。如果确实为没有排序规则的集合指定了排序规则选项,则它将不起作用。

mongos使用"majority" 作为 命令、其助手shardCollectionsh.shardCollection() 和 方法的 写关注(writesh.shardAndDistributeCollection() concern) 。

以下示例展示了如何使用带或不带可选参数的sh.shardAndDistributeCollection()方法。

名为records的数据库包含名为people的集合。 以下命令按zipcode字段对集合进行分片,并立即重新分布records.people集合中的数据:

sh.shardAndDistributeCollection("records.people", { zipcode: 1 } )

phonebook数据库有一个没有默认排序规则contacts集合。 以下示例使用sh.shardAndDistributeCollection()phonebook.contacts 集合进行分片和重新分发:

sh.shardAndDistributeCollection(
"phonebook.contacts",
{ last_name: "hashed" },
false,
{
numInitialChunks: 5,
collation: { locale: "simple" }
}
)