shardCollection
定义
shardCollection
分片将集合的文档分布到各个分片上。必须对
admin
数据库运行shardCollection
命令。shardCollection
命令。注意
已更改在版本中6.0.
从MongoDB 6.0版本开始,分片集合不需要先运行
enableSharding
命令来配置数据库。提示
在
mongosh
中,此命令还可以通过sh.shardCollection()
辅助方法运行。.辅助方法对
mongosh
用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。
兼容性
此命令在以下环境中部署的部署中可用
MongoDB Atlas:云中 MongoDB 部署的全托管服务
重要
此命令不支持在无服务器实例中。有关更多信息,请参阅 不受支持的命令。
MongoDB Enterprise:基于订阅的自托管 MongoDB 版本
MongoDB Community:源代码可用、免费使用且自托管的 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 | |
unique | boolean | 指定 当使用 哈希分片键 时,不能指定 |
numInitialChunks | integer | 指定在分片具有 哈希分片键 的 空 集合时,在集群中所有分片上创建的初始数据块数量。MongoDB 然后将创建并平衡集群中的数据块。 如果集合不为空或分片键不包含哈希字段,则该操作返回错误。
|
collation | document | 可选。如果指定给 shardCollection 的集合具有默认的 排序规则,则您必须包含一个包含 { locale : "simple" } 的排序规则文档,否则 shardCollection 命令将失败。至少有一个索引支持分片键模式的字段必须具有简单排序规则。 |
boolean | ||
object |
时间序列选项
New在版本中5.1.
要创建一个新的分片 时间序列集合,请指定 timeseries 选项给 shardCollection
.
timeseries 选项包含以下字段:
字段 | 类型 | 描述 |
---|---|---|
timeField | string | 必需。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须将有效 BSON 日期作为 从 MongoDB 8.0 开始,将 |
metaField | string | 可选。包含每个时间序列文档元数据的字段名称。指定字段的元数据应该是用于标记唯一文档序列的数据。元数据很少会更改。指定字段的名称不能是 尽管 |
粒度 | string | 可选。可能的值包括:
默认情况下,MongoDB 将 手动设置 如果您指定了 如果您未指定 如果您设置了 |
注意事项
分片键
尽管您可以在以后更改您的分片键,但仔细考虑您的分片键选择以避免可扩展性和性能问题是重要的。
时间序列集合上的分片键
在分片时间序列集合时,您只能在分片键中指定以下字段
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 } } )