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

shardCollection

在本页面上

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 注意事项
  • 示例
shardCollection

分片将集合的文档分布到各个分片上。必须对admin数据库运行shardCollection命令。shardCollection命令。

注意

已更改在版本中6.0.

从MongoDB 6.0版本开始,分片集合不需要先运行enableSharding命令来配置数据库。

提示

mongosh中,此命令还可以通过sh.shardCollection()辅助方法运行。.

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

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

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

重要

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

要运行 shardCollection,请使用 db.runCommand( { <command> } ) 方法。

该命令具有以下形式

db.adminCommand(
{
shardCollection: "<database>.<collection>",
key: { <field1>: <1|"hashed">, ... },
unique: <boolean>,
numInitialChunks: <integer>,
presplitHashedZones: <boolean>,
collation: { locale: "simple" },
timeseries: <object>
}
)

该命令接受以下字段

字段
类型
描述
shardCollection
string
要分片的集合的命名空间,格式为 <数据库名>.<集合名>
key
document

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

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

设置字段值为

分片键 必须由索引支持。除非集合为空,否则索引必须在 shardCollection 命令之前存在。如果集合为空,MongoDB 将在分片集合之前创建索引,如果尚未存在可以支持分片键的索引。

另请参阅 分片键索引

unique
boolean

指定 true 以确保底层索引强制执行唯一约束。默认为 false

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

numInitialChunks
integer

指定在分片具有 哈希分片键 集合时,在集群中所有分片上创建的初始数据块数量。MongoDB 然后将创建并平衡集群中的数据块。numInitialChunks 必须导致每个分片少于 8192 个数据块。

如果集合不为空或分片键不包含哈希字段,则该操作返回错误。

  • 如果使用 presplitHashedZones: true 进行分片,MongoDB 尝试在集群的区域内均匀分配指定的数据块数量。

  • 如果使用 presplitHashedZones: false 或省略,并且没有为空集合定义区域和区域范围,MongoDB 尝试在集群中的分片之间均匀分配指定的数据块数量。

  • 如果使用 presplitHashedZones: false 或省略,并且已为空集合定义区域和区域范围,则 numInitialChunks 无效。

collation
document
可选。如果指定给 shardCollection 的集合具有默认的 排序规则,则您必须包含一个包含 { locale : "simple" } 的排序规则文档,否则 shardCollection 命令将失败。至少有一个索引支持分片键模式的字段必须具有简单排序规则。
boolean

可选。指定 true 以根据集合定义的区域和区域范围对空或不存在的集合执行初始数据块创建和分配。仅适用于 哈希分片

如果以下任一条件为真,则使用 presplitHashedZones: trueshardCollection 返回错误:

object

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

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

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

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

New在版本中5.1.

New在版本中5.1.

要创建一个新的分片 时间序列集合,请指定 timeseries 选项给 shardCollection.

timeseries 选项包含以下字段:

字段
类型
描述
timeField
string

必需。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须将有效 BSON 日期作为 timeField 的值。

从 MongoDB 8.0 开始,将 timeField 用作时间序列集合中的分片键已被弃用。

metaField
string

可选。包含每个时间序列文档元数据的字段名称。指定字段的元数据应该是用于标记唯一文档序列的数据。元数据很少会更改。指定字段的名称不能是 _id 或与 timeseries.timeField 相同。该字段可以是任何数据类型。

尽管 metaField 字段是可选的,但使用元数据可以提高查询优化。例如,MongoDB 会自动为新集合在 metaFieldtimeField 字段上创建一个复合索引。[点击查看如何创建复合索引](/docs/manual/core/timeseries/timeseries-secondary-index/#std-label-timeseries-add-secondary-index)。如果您未为此字段提供值,则数据将仅根据时间进行分桶。

粒度
string

可选。可能的值包括:

  • "seconds"

  • "minutes"

  • "hours"

默认情况下,MongoDB 将 granularity 设置为 "seconds" 以支持高频数据摄入。

手动设置 granularity 参数,通过优化时间序列集合内部数据存储来提高性能。要为 granularity 选择一个值,请选择与连续传入测量值之间时间跨度最接近的值。

如果您指定了 timeseries.metaField,请考虑具有相同 metaField 字段唯一值的连续传入测量值之间的时间跨度。如果测量值来自同一来源,它们通常具有相同的 metaField 字段唯一值。

如果您未指定 timeseries.metaField,请考虑在集合中插入的所有测量值之间的时间跨度。

如果您设置了 granularity 参数,则不能设置 bucketMaxSpanSecondsbucketRoundingSeconds 参数。

尽管您可以在以后更改您的分片键,但仔细考虑您的分片键选择以避免可扩展性和性能问题是重要的。

提示

另请参阅

在分片时间序列集合时,您只能在分片键中指定以下字段

  • metaField

  • metaField 的子字段

  • timeField

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

指定分片键时

提示

避免仅将 timeField 指定为分片键。由于 timeField 单调递增,它可能导致所有写入都出现在集群的单个数据块中。理想情况下,数据应均匀分布在各个数据块中。

有关如何选择最佳分片键的更多信息,请参阅

从 MongoDB 8.0 开始,将 timeField 用作时间序列集合中的分片键已被弃用。

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

使用表单 field: "hashed" 指定哈希分片键字段。

注意

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

提示

另请参阅

分片集合操作(即 shardCollection 命令和 sh.shardCollection() 辅助器)可以在已定义 区域和区域范围 的集合上执行空或不存在集合的初始块创建和分布。初始块分布允许更快地设置区域分片。在初始分配之后,均衡器将按照常规管理块的分布。

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

有关使用复合哈希索引分片集合的信息,请参阅 区域分片和复合哈希索引。

MongoDB 支持在 复合哈希索引 上分片集合。当使用复合哈希分片键对空或不存在集合进行分片时,MongoDB 执行初始块创建和分布需要满足额外要求。

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

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

如果指定unique: true

  • 如果集合为空,shardCollection将创建唯一索引,前提是该索引尚未存在。

  • 如果集合不为空,在使用shardCollection.之前必须首先创建索引。

尽管可以有一个唯一的多键索引,其中分片键是前缀,但如果使用unique参数,集合必须有一个唯一的索引,该索引位于分片键上。

另请参阅分片集合和唯一索引

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

对于没有排序规则的集合,您无需指定 collation 选项。如果为没有排序规则的集合指定了排序规则选项,则该选项将不会有任何效果。

mongos 使用 "majority" 作为 写入关注 的默认值,用于 shardCollection 命令,它的辅助函数 sh.shardCollection(),以及 sh.shardAndDistributeCollection() 方法。

以下操作为 records 数据库中的 people 集合启用分片,并使用 zipcode 字段作为 分片键

db.adminCommand( { shardCollection: "records.people", key: { zipcode: 1 } } )

返回

setAllowMigrations