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

shardCollection

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • Considerations
  • 例子
shardCollection

集合进行分集合以跨分片分发其文档。 必须先对数据库运行enableSharding ,然后才能运行 shardCollection命令。 shardCollection命令必须针对admin数据库运行。

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

提示

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

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

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

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

重要

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

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

该命令采用以下形式:

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

该命令接受以下字段:

字段
类型
说明
shardCollection
字符串
要分片的集合的命名空间,格式为 <database>.<collection>
key
文档

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

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

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

分片键必须有索引支持。除非集合为空,否则索引必须在 shardCollection 命令之前存在。如果集合为空,并且尚不存在可以支持分片键的索引,MongoDB 会在对集合进行分片之前创建索引。

另请参阅分片键索引

unique
布尔

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

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

numInitialChunks
整型

指定在使用哈希分片键集合进行分片时,要在集群中所有分片上创建的数据块初始数量。然后,MongoDB 在集群中创建并均衡数据块。numInitialChunks 的结果必须少于每个分片的 8192

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

  • 如果使用 presplitHashedZones: true 进行分片,MongoDB 会尝试将指定数量的数据块平均分配到集群中的各区域。

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

  • 如果使用 presplitHashedZones: false 进行分片或省略分片,并且已为空集合定义了区域和区域范围,numInitChunks 将不起作用。

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

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

shardCollectionpresplitHashedZones: true 返回错误,如果满足以下任一条件:

虽然您可在后续更改分片键,但请务必仔细考虑分片键的选择,以免出现可扩展性与性能问题。

提示

另请参阅:

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

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

注意

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

提示

另请参阅:

分片集合操作(即shardCollection 命令和 sh.shardCollection() 辅助程序)可以对空集合或不存在的集合执行初始数据块创建和分发,前提是已为该集合定义区域和区域范围)。初始数据块分布允许更快地设置区域分片。在初始分布之后,负载均衡器将照例管理未来的数据块分布。

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

要使用复合哈希索引对集合进行分片,请参阅区域分片和复合哈希索引。

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

如果已为空集合定义区域和区域范围 presplitHashedZonesfalse,则 numInitialChunks 选项无效。

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

如果指定 unique: true

  • 如果集合为空,shardCollection 将在分片键上创建唯一索引(如果这样的索引尚不存在)。

  • 如果集合不为空,则必须先创建索引,然后才能使用 shardCollection

尽管可以有以分片键为前缀的唯一复合索引,但如果使用unique参数,则集合必须在分片键上有唯一索引。

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

已在 3.4 版本中更改

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

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

mongos 使用 "majority",执行 shardCollection 命令及其辅助函数 sh.shardCollection()写关注

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

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

后退

setAllowMigrations