create
定义
创建
显式创建一个集合或视图。
注意
此命令创建的视图不引用物化视图。有关按需物化视图的讨论,请参阅
$merge
。
兼容性
此命令可在以下环境中托管的部署中使用
MongoDB Atlas:MongoDB在云中的完全托管服务
注意
此命令支持MongoDB Atlas的所有集群。有关Atlas对所有命令的支持信息,请参阅不受支持的命令。
MongoDB企业版:MongoDB的基于订阅的自托管版本
MongoDB社区版: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
命令具有以下字段
字段 | 类型 | 描述 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
create | 字符串 | 新集合或视图的名称。请参阅命名限制。如果您尝试创建一个已存在的集合或视图,并且为该现有集合或视图提供了相同的选项,则不会执行任何操作,并返回成功。 | ||||||||||||||||
受限 | 布尔型 | |||||||||||||||||
timeseries.timeField | 字符串 | 创建时间序列集合时必填。包含每个时间序列文档中日期的字段名称。时间序列集合中的文档必须将有效的BSON日期作为 timeField 的值。 | ||||||||||||||||
timeseries.metaField | 字符串 | 可选。包含每个时间序列文档中元数据的字段名称。指定字段中的元数据应该是用于标记唯一文档序列的数据。元数据很少或几乎不会更改。指定字段的名称不能是 尽管 | ||||||||||||||||
timeseries.granularity | 字符串 | 可选,在设置 将 有关粒度和分桶间隔的更多信息,请参阅设置时间序列数据的粒度。 | ||||||||||||||||
timeseries.bucketMaxSpanSeconds | 整数 | 可选,与 要降级到MongoDB 6.3以下版本,您必须修改集合以使用相应的 | ||||||||||||||||
timeseries.bucketRoundingSeconds | 整数 | 可选,与 例如,将这两个参数都设置为 | ||||||||||||||||
expireAfterSeconds | 整数 | 可选。指定时间序列集合或分片集合中文档过期后的秒数。MongoDB会自动删除过期的文档。 | ||||||||||||||||
clusteredIndex | 文档 | 从MongoDB 5.3版本开始,您可以使用聚簇索引创建集合。聚簇索引存储在与集合相同的WiredTiger文件中。结果集合称为聚簇集合。
新功能在版本5.3. | ||||||||||||||||
changeStreamPreAndPostImages | 文档 | 可选。 从MongoDB 6.0版本开始,您可以使用变更流事件输出文档更改前后(文档前像和后像)的版本。
要为集合启用变更流前像和后像,请将 有关变更流输出的完整示例,请参阅带有文档前像和后像的变更流。 有关本页上的 新功能在版本6.0. | ||||||||||||||||
size | 整数 | 可选。指定分片集合的最大字节数。一旦分片集合达到其最大大小,MongoDB会删除较旧的文档以为新文档腾出空间。对于分片集合,需要 size 字段,但对于其他集合则忽略。 | ||||||||||||||||
max | 整数 | 可选。限制在受限集合中允许的最大文档数量。当受限集合达到 size 限制之前,MongoDB 会删除旧文档。如果您希望使用 max 限制,请确保 size 限制(对于受限集合是必需的)足以包含最大数量的文档。 | ||||||||||||||||
storageEngine | 文档 | |||||||||||||||||
validator | 文档 | |||||||||||||||||
validationLevel | 字符串 | 可选。确定 MongoDB 在更新期间如何严格地应用验证规则到现有文档。
| ||||||||||||||||
validationAction | 字符串 | 可选。确定是否在无效文档上 文档的验证仅适用于由
| ||||||||||||||||
indexOptionDefaults | 文档 | 可选。允许用户在创建集合时指定索引的默认配置。
在创建索引时指定的存储引擎配置会被验证并记录到操作日志中,以支持使用不同存储引擎的副本集成员。 | ||||||||||||||||
viewOn | 字符串 | 要创建视图的源集合或视图的名称。该名称不是集合或视图的全命名空间;即不包括数据库名称,并暗示与要创建的视图相同的数据库。您必须在与源集合相同的数据库中创建视图。 另请参阅 | ||||||||||||||||
pipeline | 数组 | 一个数组,由聚合管道阶段组成。 视图定义的 视图定义是公开的;即 另请参阅 | ||||||||||||||||
collation | 指定集合或视图的默认 校对。 校对 允许用户指定字符串比较的语言特定规则,例如字母大小写和重音符号的规则。 collation 选项具有以下语法
指定校对时, 如果您在集合级别指定了校对
如果未指定集合或操作中的校对,MongoDB 将使用先前版本中用于字符串比较的简单二进制比较。 对于一个视图,如果没有指定排序规则,视图的默认排序规则是“简单”的二进制比较排序器。对于一个集合上的视图,视图不会继承集合的排序规则设置。对于一个视图上的视图,要创建的视图必须指定相同的排序规则。 在创建集合或视图之后,无法更新其默认排序规则。 有关在创建集合时指定默认排序规则的示例,请参阅指定排序规则。 | |||||||||||||||||
writeConcern | 文档 | 可选。一个文档,表示操作的写关注。省略以使用默认写关注。 当在分片集群上执行时, | ||||||||||||||||
encryptedFields | 文档 | 可选。一个文档,用于配置正在创建的集合的可查询加密。 要使用集合中的加密字段,请指定新的配置选项。您必须具有创建和修改集合的权限才能创建或编辑此配置。 配置包括字段列表及其对应的密钥标识符、类型和支持的查询。
有关详细信息,请参阅教程。 | ||||||||||||||||
comment | 任何 | 可选。用户提供的注释,附加到此命令。一旦设置,此注释将出现在以下位置的此命令记录旁边
注释可以是任何有效的BSON类型(字符串、整数、对象、数组等)。 |
db.createCollection()
方法和db.createView()
方法包装了create
命令。
行为
create
具有以下行为
资源锁定
create
在操作期间对指定的集合或视图获取独占锁。所有后续的集合操作必须等待 create
释放锁。通常情况下,create
仅持有该锁很短的时间。
创建视图需要获取数据库中 system.views
集合的附加独占锁。此锁阻止在命令完成之前创建或修改数据库中的视图。
事务
如果事务不是跨分片写事务,则可以在 分布式事务 内创建集合和索引。不是 跨分片写事务。
要在事务中使用 create
,事务必须使用读关注 "local"
。如果您指定了除 "local"
之外的读关注级别,则事务将失败。
具有相同名称和选项的集合或视图
如果您使用与现有集合或视图相同的名称和选项运行 create
,则 create
返回成功。
稳定API
已更改在版本5.0.
当使用 稳定API V1 时,您不能在 create
命令中指定以下字段
autoIndexId
受限
indexOptionDefaults
max
size
storageEngine
访问控制
如果部署强制执行 身份验证/授权,则 create
需要以下权限
任务 | 所需权限 |
---|---|
创建非固定集合 |
|
创建 固定集合 | 在数据库上 |
创建一个视图 |
具有数据库上内置的readWrite
角色的用户具有执行所列操作的必要权限。或者创建一个具有所需角色的用户或者将角色授予现有用户。
示例
创建一个有限制为64千字节的Capped Collection
要创建一个限制为64千字节的Capped Collection,可以使用以下命令形式
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版本开始,您可以使用变更流事件输出文档更改前后(文档前像和后像)的版本。
前像是替换、更新或删除之前的文档。对于插入的文档没有前像。
后像是插入、替换或更新之后的文档。对于删除的文档没有后像。
使用
db.createCollection()
、create
或collMod
启用changeStreamPreAndPostImages
以启用集合的变更流前像和后像。
以下示例创建了一个启用了changeStreamPreAndPostImages的集合
db.runCommand( { create: "temperatureSensor", changeStreamPreAndPostImages: { enabled: true } } )
如果图像在文档更新或删除操作时未启用,则更改流事件不可用
的前后图像
在
expireAfterSeconds
中设置的保留时间之后被删除。以下示例将整个集群上的
expireAfterSeconds
设置为100
秒use admin db.runCommand( { setClusterParameter: { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } } } ) 以下示例返回当前的
changeStreamOptions
设置,包括expireAfterSeconds
db.adminCommand( { getClusterParameter: "changeStreamOptions" } ) 将
expireAfterSeconds
设置为off
使用默认保留策略:前后图像保留,直到相应的更改流事件从oplog中删除。如果从oplog中删除更改流事件,则相应的前后图像也将被删除,无论
expireAfterSeconds
的前后图像保留时间。
其他注意事项
启用前后图像会消耗存储空间并增加处理时间。只有在需要时才启用前后图像。
将更改流事件的大小限制在小于16兆字节。要限制事件大小,您可以将
将文档大小限制在8兆字节。如果其他更改流事件字段(如
updateDescription
)不大,您可以在更改流输出中同时请求前后图像。对于16兆字节以下的文档,如果其他更改流事件字段(如
updateDescription
)不大,则只请求更改流输出中的后图像。如果请求更改流输出中的前图像,对于16兆字节以下的文档
文档更新仅影响文档结构或内容的一小部分,并且
不会引起
replace
更改事件。replace
事件始终包括后图像。
要请求前图像,您将
fullDocumentBeforeChange
设置为required
或whenAvailable
在db.collection.watch()
中。要请求后图像,您使用相同的方法设置fullDocument
。前图像写入到
config.system.preimages
集合。config.system.preimages
集合可能会变得很大。为了限制集合大小,您可以设置前图像的expireAfterSeconds
时间,如前所述。预图像由后台进程异步删除。
重要
向后不兼容的功能
从MongoDB 6.0开始,如果您正在使用change streams的文档预图像和后图像,您必须使用changeStreamPreAndPostImages禁用每个集合,在降级到较早期的MongoDB版本之前,使用collMod
命令。
创建视图
注意
此命令创建的视图不引用物化视图。有关按需物化视图的讨论,请参阅$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 开始,您无法在创建集合时指定 wiredTiger
存储引擎加密选项。要配置 WiredTiger 存储引擎的加密,请参阅 静态加密。