Docs 主页 → 开发应用程序 → MongoDB Manual
shardCollection
定义
shardCollection
对集合进行分片以跨分片分发其文档。
shardCollection
命令必须针对admin
数据库运行。注意
在 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 | 字符串 | 要分片的集合的命名空间,格式为 <database>.<collection> 。 |
key | 文档 | |
unique | 布尔 | 指定 使用哈希分片键时,不能指定 |
numInitialChunks | 整型 | 指定在使用哈希分片键对空集合进行分片时,要在集群中所有分片上创建的数据段初始数量。然后,MongoDB 在集群中创建并均衡数据段。 如果集合不为空或分片键不包含哈希字段,则操作将返回错误。
|
collation | 文档 | 可选。如果指定给 shardCollection 的集合具有默认排序规则,则必须包含附带 { locale : "simple" } 的排序规则文档,否则 shardCollection 命令将失败。对于其字段支持分片键模式的索引,必须至少有一个索引采用简易排序规则。 |
布尔 | ||
对象 |
时间序列选项
5.1 版本中的新功能。
要创建新的分片时间序列集合,请将timeseries选项指定为shardCollection
。
timeseries选项包含以下字段:
字段 | 类型 | 说明 |
---|---|---|
timeField | 字符串 | 必需。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须具有有效 BSON 日期,以作为 |
metaField | 字符串 | 可选。包含每个time-series文档中元数据的字段的名称。指定字段中的元数据应该是用于标记一系列唯一文档的数据。元数据应该很少(如果有的话)更改。指定字段的名称可能不是 虽然 |
granularity | 字符串 | 可选。可能的值为:
默认情况下,MongoDB 将 手动设置 如果您指定 如果未指定 如果设置了 |
考虑因素
使用
请勿同时对同一集合运行多个shardCollection
命令。
集合被分片后,MongoDB 就不再提供对分片集合进行取消分片的方法。
分片键
虽然您可在后续更改分片键,但请务必仔细考虑分片键的选择,以免出现可扩展性与性能问题。
时间序列集合上的分片键
对时间序列集合进行分片时,您只能为分片键指定以下字段:
使用
metaField
子字段
metaField
使用
timeField
您可以在分片键中指定这些字段的组合。不允许在分片键模式中使用任何其他字段,包括 _id
。
在您指定分片键时:
提示
避免仅指定 timeField
作为分片键。由于 timeField
是单调增加的,因此,可能导致所有写入都出现在集群中的单个数据段上。理想情况下,数据均匀分布在数据段之间。
要了解如何最好地选择分片键,请参阅:
哈希分片键
使用表单 field: "hashed"
指定哈希分片键字段。
注意
如果在创建哈希分片键集合时正在进行块迁移,则初始块分布可能会不均匀,直到负载均衡器自动平衡集合。
提示
另请参阅:
区域分片和初始数据块分布
如果已为集合定义 区域和区域范围sh.shardCollection()
,则分片集合操作(即shardCollection
命令和 助手)可以为空或不存在的集合执行初始数据段创建和分配。初始数据段分布可以更快地设置分区分片。初始分配后,负载均衡器将照常管理未来的数据段分配。
有关示例,请参阅为空集合或不存在的集合预先定义区域和区域范围。如果使用范围或单字段哈希分片键对集合进行分片,并且已为空集合定义了区域和区域范围,则 numInitialChunks
选项将不起作用。
要使用复合哈希索引对集合进行分片,请参阅区域分片和复合哈希索引。
区域分片和复合哈希索引
MongoDB 支持对复合哈希索引上的collection进行分片。使用哈希分片键对空的collection或不存在的collection进行分片时,需要满足其他要求,MongoDB 才能执行初始数据块创建和分发。
如果已为空集合定义区域和区域范围且presplitHashedZones为false
,则numInitialChunks
选项不起作用。
有关示例,请参阅为空集合或不存在的集合预先定义区域和区域范围。
提示
唯一性
如果指定 unique: true
:
如果集合为空,
shardCollection
会在分片键上创建唯一索引(如果此类索引尚不存在)。如果集合不为空,则必须先创建索引,然后才能使用
shardCollection
。
尽管可以有以分片键为前缀的唯一复合索引,但如果使用unique
参数,则集合必须在分片键上有唯一索引。
另请参阅分片集合和唯一索引
排序规则
如果集合具有默认排序规则,则shardCollection
命令必须包含值为{ locale: "simple" }
的collation
参数。对于具有默认排序规则的非空集合,您必须至少拥有一个具有简单排序规则且其字段支持分片键模式的索引。
无需为没有排序规则的集合指定 collation
选项。如果确实为没有排序规则的集合指定了排序规则选项,则它将不起作用。
写关注
mongos
使用"majority"
作为 命令及其助手 shardCollection
sh.shardCollection()
的 写关注 。
例子
以下操作为 records
数据库中的 people
集合启用分片并使用 zipcode
字段作为分片键:
db.adminCommand( { shardCollection: "records.people", key: { zipcode: 1 } } )