定义
create显式创建集合或视图。
注意
此命令创建的视图不引用物化视图。有关按需物化视图的讨论,请参阅
$merge。
兼容性
此命令可用于以下环境中托管的部署:
- MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
create 命令具有以下语法:
注意
MongoDB 6.3 增加了 bucketMaxSpanSeconds 和 bucketRoundingSeconds 参数。要降级到 6.3 以下,必须删除所有具有这些参数的集合,或者修改它们以使用相应的 granularity(如果可能)。有关详细信息,请参阅 collMod。
db.runCommand( { create: <collection or view name>, capped: <true|false>, timeseries: { timeField: <string>, metaField: <string>, granularity: <string>, bucketMaxSpanSeconds: <timespan>, // Added in MongoDB 6.3 bucketRoundingSeconds: <timespan> // Added in MongoDB 6.3 }, expireAfterSeconds: <number>, clusteredIndex: <document>, // Added in MongoDB 5.3 changeStreamPreAndPostImages: <document>, // Added in MongoDB 6.0 autoIndexId: <true|false>, size: <max_size>, max: <max_documents>, storageEngine: <document>, validator: <document>, validationLevel: <string>, validationAction: <string>, indexOptionDefaults: <document>, viewOn: <source>, pipeline: <pipeline>, collation: <document>, writeConcern: <document>, encryptedFields: <document>, comment: <any> }
命令字段
create 命令拥有以下字段:
字段 | 类型 | 说明 | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 字符串 | 新集合或视图的名称。请参阅命名限制。如果您尝试创建已经存在的集合或视图,并且为该现有集合或视图提供相同的选项,则系统不会采取任何操作并返回成功。 | |||||||||||||
| 布尔 | 可选。要创建固定大小集合,请将该字段设为 | |||||||||||||
| 字符串 | 创建时间序列集合时需要。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须具有有效 BSON 日期,以作为 | |||||||||||||
| 字符串 | 可选。包含每个时间序列文档中元数据的字段的名称。指定字段中的元数据应是用于标记一系列独一无二的文档的数据。元数据应该很少改变(如有)。指定字段的名称可能不是 虽然 | |||||||||||||
| 字符串 | 可选,如果设置 将 有关粒度和桶间隔的更多信息,请参阅设置时间序列数据的粒度。 | |||||||||||||
| 整型 | 可选,与 要降级到 MongoDB 6.3 以下,必须修改集合以使用相应的 | |||||||||||||
| 整型 | 可选,与 例如,将两个参数设置为 | |||||||||||||
| 整型 | ||||||||||||||
| 文档 | 从 MongoDB 5.3开始,您可以创建具有集群化索引的集合。集群化索引与集合存储在同一个 WiredTiger 文件中。得到的集合称为集群化集合。
5.3版本新增。 | |||||||||||||
| 文档 | 可选。 从 MongoDB 6.0 开始,可使用变更流事件来输出更改前后的文档版本(文档前映像和后映像):
要启用集合的变更流前图像和后图像,请将 有关变更流输出的完整示例,请参阅使用文档前像和后像的变更流。 如需了解有关本页的 6.0版本新增。 | |||||||||||||
| 布尔 | 可选。 指定 重要:从 MongoDB 4.0 开始,在 自版本 3.2 起已弃用。 | |||||||||||||
| 整型 | 可选。指定固定大小集合的最大大小(以字节为单位)。一旦固定大小集合达到其最大大小,MongoDB 就会删除旧文档,为新文档腾出空间。对于固定大小集合, | |||||||||||||
| 整型 | 可选。固定大小集合中允许的最大文档数。 | |||||||||||||
| 文档 | 可选。仅适用于 WiredTiger 存储引擎。 允许用户在创建集合时针对每个集合指定存储引擎的配置。 在复制过程中,对创建集合时指定的存储引擎配置进行验证并记录到 oplog 中,以支持节点使用不同存储引擎的副本集。 从 MongoDB 7.2 开始,在使用 有关更多信息,请参阅指定存储引擎选项。 | |||||||||||||
| 文档 | 可选。允许用户为集合指定验证规则或表达式。
| |||||||||||||
| 字符串 | 可选。确定 MongoDB 在更新期间将验证规则应用于现有文档的严格程度。
| |||||||||||||
| 字符串 | 可选。 确定是对无效文档上的 文档验证仅适用于由
| |||||||||||||
| 文档 | 可选。允许用户在创建集合时指定索引的默认配置。
在复制过程中,对创建索引时指定的存储引擎配置进行验证并记录到 oplog 中,以支持其成员使用不同存储引擎的副本集。 | |||||||||||||
| 字符串 | 要从中创建视图的源集合或视图的名称。该名称不是集合或视图的完整命名空间。它不包括数据库名称。您必须在与源集合相同的数据库中创建视图。 另请参阅 | |||||||||||||
| 阵列 | 由 aggregation pipeline 阶段组成的数组。 视图定义 视图定义是公开的;即视图上的 另请参阅 | |||||||||||||
| 指定集合或视图的默认排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。 排序规则选项的语法如下: 指定排序规则时, 如果在集合级别指定排序规则:
如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。 对于视图,如果未指定排序规则,则视图的默认排序规则是“基本”二进制比较排序规则器。对于集合上的视图,视图不会继承集合的排序规则设置。对于另一个视图上的视图,要创建的视图必须指定相同的排序规则设置。 创建集合或视图后,无法更新其默认排序规则。 有关在集合创建期间指定默认排序规则的示例,请参阅指定排序规则。 | ||||||||||||||
| 文档 | 可选。表达该操作的写关注的文档。省略以使用默认的写关注。 在分片集群上发出时, 会将 | |||||||||||||
| 文档 | 可选。为正在创建的集合配置 Queryable Encryption 的文档。 要在集合中使用加密字段,请指定新的配置选项。您必须拥有创建和修改集合的权限,才能在集合创建期间设立此配置。创建集合后, 配置包括字段列表及其对应的键标识符、类型和支持的查询。 有关详细信息,请参阅Queryable Encryption教程。 | |||||||||||||
| any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
db.createCollection() 方法和 db.createView() 方法封装了 create 命令。
行为
create 有以下行为:
资源锁定
create在操作期间获得指定集合或视图的独占锁。对集合的所有后续操作都必须等到create 释放该锁。create 通常会短暂占用此锁。
创建视图需获得数据库中 system.views 集合的额外独占锁。此锁会阻止创建或修改数据库中的视图,直到命令完成。
事务
如果分布式事务不是跨分片写入事务,则可以在该事务中创建集合和索引。
要在事务中使用 create,该事务必须使用读关注 "local"。如果指定 "local" 以外的读关注级别,则该事务将失败。
具有相同名称和选项的collection或视图
如果使用与现有collection或视图相同的名称和选项运行create ,则create会返回成功。
Stable API
在版本5.0中进行了更改。
使用 Stable API V1 时,支持所有 create 命令字段,但 Stable API V1 中不支持以下字段:
autoIndexIdcappedindexOptionDefaultsmaxsizestorageEngine
访问控制
如果部署强制执行身份验证/授权,则 create需要以下特权:
任务 | 所需权限 |
|---|---|
创建固定大小集合 | 数据库上的
|
创建固定大小集合 |
|
创建视图 |
但是,如果用户在数据库上具有 |
在数据库中拥有 readWrite 内置角色的用户具有运行列表操作所需的特权。创建一个拥有所需角色的用户,或者将该角色授予现有用户。
示例
创建固定大小集合
要创建限制为 64 KB 的固定大小集合,请按以下格式发出命令:
db.runCommand( { create: "collection", capped: true, size: 64 * 1024 } )
创建时间序列集合
要创建捕捉过去 24 小时天气数据的时间序列集合,请发出此命令:
db.createCollection( "weather24h", { timeseries: { timeField: "timestamp", metaField: "data", granularity: "hours" }, expireAfterSeconds: 86400 } )
或者,要创建相同的集合,但将每个存储桶在同一小时内限制为时间戳值,请发出以下命令:
db.createCollection( "weather24h", { timeseries: { timeField: "timestamp", metaField: "data", bucketMaxSpanSeconds: 3600, bucketRoundingSeconds: 3600 }, expireAfterSeconds: 86400 } )
注意
在此示例中,expireAfterSeconds 被指定为 86400,这意味着文档在 timestamp 值后 86400 秒过期。请参阅设置时间序列采集 (TTL) 的自动删除。
创建集群化集合
以下create 示例添加一个名为products 的聚集文档:
db.runCommand( { create: "products", clusteredIndex: { "key": { _id: 1 }, "unique": true, "name": "products clustered key" } } )
在此示例中,clusteredIndex 将指定:
"key": { _id: 1 },用于按照_id字段设置集群索引键。"unique": true,它表示聚集索引键值必须是唯一的。"name": "products clustered key",设置集群索引名称。
使用文档的变更流前像和后像创建集合
从 MongoDB 6.0 开始,可使用变更流事件来输出更改前后的文档版本(文档前映像和后映像):
前映像是指被替换、更新或删除之前的文档。已插入的文档没有前映像。
后图像是插入、替换或更新后的文档。 已删除的文档没有后图像。
changeStreamPreAndPostImages使用db.createCollection()create、 或collMod为集合启用 。示例,使用collMod命令时:db.runCommand( { collMod: <collection>, changeStreamPreAndPostImages: { enabled: true } } )
以下示例创建一个启用了 ChangeStreampreandPostImages 的集合:
db.runCommand( { create: "temperatureSensor", changeStreamPreAndPostImages: { enabled: true } } )
如果图像属于以下情况,则前像和后像不可用于变更流事件:
在文档更新或删除操作时未对集合启用。
在
expireAfterSeconds中设置的前像和后像保留时间后之后被删除。以下示例将整个集群上的
expireAfterSeconds设置为100秒:use admin db.runCommand( { setClusterParameter: { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } } } ) 注意
MongoDB Atlas集群中不支持
setClusterParameter命令。有关AtlasAtlas支持所有命令的信息,请参阅AtlasAtlas中不支持的命令。以下示例返回当前的
changeStreamOptions设置,包括expireAfterSeconds:db.adminCommand( { getClusterParameter: "changeStreamOptions" } ) 将
expireAfterSeconds设置为off可使用默认保留策略:将保留前像和后像,直到从 oplog 中删除对应的变更流事件。如果变更流事件从 oplog 中删除,则无论
expireAfterSeconds前映像和后映像保留时间如何,相应的前映像和后映像也会被删除。
其他考量:
启用前像和后像会占用存储空间并增加处理时间。仅在需要时启用前像和后像。
将变更流事件大小限制为小于 16 MiB。要限制事件大小,您可以:
将文档大小限制为 8 MB。如果其他 change stream 事件字段(例如
updateDescription)不是很大,则可以在 change stream 输出中同时请求更新前的文档和更新后的文档。如果其他变更流事件字段(例如
updateDescription)并不大,则仅请求变更流输出中最多 16 MiB 的文档的后像。在以下情况下,仅请求变更流输出中最多 16 MiB 的文档的前像:
文档更新仅影响文档结构或内容的一小部分,且
不会引起
replace变更事件。replace事件始终包含后像。
要请求前图像,请在
db.collection.watch()中将fullDocumentBeforeChange设置为required或whenAvailable。要请求后图像,您可以使用相同的方法设置fullDocument。前像被写入
config.system.preimages集合。config.system.preimages集合可能会变大。要限制集合大小,可如前文所示为前映像设置expireAfterSeconds时间。要监控
config.system.preimages的大小,请连接到分片集群上的分片节点或副本集上的mongod节点。然后,运行以下命令:use config db.system.preimages.totalSize() db.system.preimages.stats() 注意
您必须对
config.system.preimages集合拥有collStats权限操作才能运行这些命令。要在 MongoDB Atlas 部署上运行这些命令,您必须具有
atlasAdmin角色。前像由后台进程异步删除。
重要
向后不兼容的功能
从 MongoDB 6.0 开始,如果您将文档前图像和后图像用于 change stream,则必须使用 collMod 命令为每个集合禁用 changeStreamPreAndPostImages,然后才能降级到早期 MongoDB 版本。
提示
有关变更流事件和输出,请参阅变更流事件。
要查看集合的变化,请参阅
db.collection.watch()。有关变更流输出的完整示例,请参阅使用文档前像和后像的变更流。
创建视图
注意
此命令创建的视图不引用物化视图。有关按需物化视图的讨论,请参阅 $merge。
视图定义 pipeline 不能包含 $out 或 $merge 阶段。这一限制也适用于嵌入式管道,例如在 $lookup 或 $facet 阶段中使用的管道。
要使用 create 命令创建视图,请使用以下语法:
db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline> } )
或者,当指定排序规则时:
db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } )
例如,使用以下文档创建 survey 集合:
db.survey.insertMany( [ { _id: 1, empNumber: "abc123", feedback: { management: 3, environment: 3 }, department: "A" }, { _id: 2, empNumber: "xyz987", feedback: { management: 2, environment: 3 }, department: "B" }, { _id: 3, empNumber: "ijk555", feedback: { management: 3, environment: 4 }, department: "A" } ] )
以下操作将创建一个包含 _id、feedback.management和 department 字段的 managementRatings 视图:
db.runCommand ( { create: "managementFeedback", viewOn: "survey", pipeline: [ { $project: { "management": "$feedback.management", department: 1 } } ] } )
重要
视图定义是公开的;即视图上的 db.getCollectionInfos() 和 explain 操作将包括定义视图的管道。因此,应避免在视图定义中直接引用敏感字段和值。
指定排序规则。
您可在集合或视图级别指定排序规则。例如,以下操作会创建一个集合,并为该集合指定排序规则(请参阅排序规则文档以查看排序规则字段的描述):
db.runCommand ( { create: "myColl", collation: { locale: "fr" } });
支持排序规则的索引和操作将使用此排序规则,除非它们明确指定不同的排序规则。例如,将以下文档插入到 myColl 中:
{ _id: 1, category: "café" } { _id: 2, category: "cafe" } { _id: 3, category: "cafE" }
以下操作使用集合的排序规则:
db.myColl.find().sort( { category: 1 } )
该操作按以下顺序返回文档:
{ "_id" : 2, "category" : "cafe" } { "_id" : 3, "category" : "cafE" } { "_id" : 1, "category" : "café" }
对使用二进制排序规则的集合执行相同操作会按以下顺序返回文档:
{ "_id" : 3, "category" : "cafE" } { "_id" : 2, "category" : "cafe" } { "_id" : 1, "category" : "café" }
指定存储引擎选项
使用 db.createCollection() 创建集合时,可以指定特定于集合的存储引擎配置选项。考虑以下操作:
db.runCommand( { create: "users", storageEngine: { wiredTiger: { configString: "<option>=<setting>" } } } )
此操作将创建一个名为users 的新集合,其中包含MongoDB传递给wiredTiger 存储引擎的特定配置字符串。有关特定的 选项,请参阅集合级别选项的WiredTiger文档。wiredTiger
从 MongoDB 7.2 开始,在使用db.createCollection()创建collection时无法指定wiredTigerstorage engine加密选项。要为 WiredTiger 存储引擎配置加密,请参阅静态加密。