创建
定义
create
显式创建集合或视图。
注意
此命令创建的视图不引用物化视图。有关按需物化视图的讨论,请参阅
$merge
。create
采用以下形式:{ create: <collection or view name>, capped: <true|false>, timeseries: { timeField: <string>, metaField: <string>, granularity: <string> }, expireAfterSeconds: <number>, 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>, comment: <any> } create
有以下字段:字段类型说明create
字符串新collection或视图的名称。请参阅命名限制。capped
布尔timeseries.timeField
字符串创建时间序列集合时需要。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须具有有效 BSON 日期,以作为timeField
的值。timeseries.metaField
字符串可选。包含每个时间序列文档中元数据的字段的名称。指定字段中的元数据应用于标识一系列唯一文档的数据。元数据应该很少改变(如果有的话)。
指定字段的名称可能不是
_id
或与timeseries.timeField
不同。该字段可为除数组之外的任意类型。timeseries.granularity
字符串可选。 可能的值为"seconds"
(默认值)、"minutes"
和"hours"
。 将粒度设置为与连续传入测量之间的时间跨度最接近的值。 准确设置granularity
参数可优化time-series collection中数据的内部存储方式,从而提高性能。expireAfterSeconds
数字可选。 通过指定文档过期后的秒数,启用自动删除时间序列集合中文档的功能。 MongoDB 会自动删除过期文档。autoIndexId
布尔可选。 指定
false
可禁用在_id
字段上自动创建索引的功能。重要
从 MongoDB 4.0 开始,在数据库以外的数据库中创建collection时,不能将选项
autoIndexId
设置为false
。local
自 3.2 版起已弃用。
size
整型可选。指定固定大小集合的最大大小(以字节为单位)。一旦固定大小集合达到其最大大小,MongoDB 就会删除旧文档,为新文档腾出空间。对于固定大小集合,size
字段为必需项,对于其他集合,则忽略该字段。max
整型可选。固定大小集合中允许的最大文档数。size
限制优先于此限制。如果固定大小集合在达到最大文档数之前达到size
限制,则 MongoDB 将删除旧文档。如果您希望使用max
限制,请确保固定大小集合所需的size
限制足以包含最大数量的文档。storageEngine
文档validator
文档可选。 允许用户为collection指定验证规则或表达式。有关更多信息,请参阅模式验证。
版本 3.2 中的新增功能。
validator
选项采用指定验证规则或表达式的文档。可以使用与该查询运算符相同的操作符来指定表达式,但$near
、$nearSphere
、$text
和$where
除外。注意
更新和插入期间进行验证。现有文档在修改之前不会进行验证检查。
不能为
admin
、local
和config
数据库中的集合指定验证器。无法为
system.*
集合指定验证器。
validationLevel
字符串可选。确定 MongoDB 在更新期间将验证规则应用于现有文档的严格程度。
版本 3.2 中的新增功能。
validationLevel
说明"off"
不对插入或更新进行验证。"strict"
默认将验证规则应用于所有插入和所有更新。"moderate"
将验证规则应用于现有有效文档的插入和更新。请勿将规则应用于现有无效文档的更新。validationAction
字符串可选。 确定是对无效文档上的
error
,还是仅对违规行为的warn
,但允许插入无效文档。版本 3.2 中的新增功能。
重要
文档验证仅适用于由
validationLevel
确定的文档。validationAction
说明"error"
默认值文档必须在写入之前通过验证。否则,写入操作将失败。"warn"
文档不必通过验证。如果文档未通过验证,则写入操作将记录验证失败。indexOptionDefaults
文档可选。允许用户在创建集合时指定索引的默认配置。
indexOptionDefaults
选项接受storageEngine
文档,该文档应采用以下形式:{ <storage-engine-name>: <options> } 在复制过程中,对创建索引时指定的存储引擎配置进行验证并记录到 oplog 中,以支持其成员使用不同存储引擎的副本集。
版本 3.2 中的新增功能。
viewOn
字符串要从中创建视图的源集合或视图的名称。该名称不是集合或视图的完整命名空间;即不包括数据库名称,并意味着与要创建的视图是同一个数据库。您必须在与源集合相同的数据库中创建视图。
另请参阅
db.createView()
。版本 3.4 中的新增功能。
pipeline
阵列由聚合管道阶段组成的数组。
create
通过将指定的pipeline
应用于viewOn
集合或视图来创建视图。视图定义
pipeline
不能包含$out
或$merge
阶段。 如果视图定义包含嵌套管道(例如视图定义包含$lookup
或$facet
阶段),则此限制也适用于嵌套管道。视图定义是公开的;即视图上的
db.getCollectionInfos()
和explain
操作将包括定义视图的管道。因此,应避免在视图定义中直接引用敏感字段和值。另请参阅
db.createView()
。版本 3.4 中的新增功能。
collation
指定集合或视图的默认排序规则。
排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。
排序规则选项的语法如下:
collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } 指定排序规则时,
locale
字段为必填字段;所有其他排序规则字段均为可选字段。有关字段的说明,请参阅排序规则文档。如果在集合级别指定排序规则:
除非索引创建操作显式指定其他排序规则,否则会用该排序规则创建此集合上的索引。
除非明确指定其他排序规则,否则对该集合的操作使用集合的默认排序规则。
您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。
如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。
对于视图,如果未指定排序规则,则视图的默认排序规则是“简单”二进制比较排序规则。对于集合上的视图,视图不会继承集合的排序规则设置。对于另一个视图上的视图,要创建的视图必须指定相同的排序规则设置。
创建集合或视图后,无法更新其默认排序规则。
有关在集合创建期间指定默认排序规则的示例,请参阅指定排序规则。
版本 3.4 中的新增功能。
writeConcern
文档可选。表达该操作的写关注的文档。省略以使用默认的写关注。
在分片集群上发出时,
mongos
将create
命令及其辅助程序db.createCollection()
的 写关注转换为"majority"
。comment
任何可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
mongod 日志消息,位于
attr.command.cursor.comment
字段中。command.comment
字段中的数据库分析器输出。currentOp
输出,在command.comment
字段。
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。
4.4 版本新增。
db.createCollection()
方法和db.createView()
方法封装了create
命令。
行为
资源锁定
版本 4.2 中进行了更改。
create
在操作期间获得指定集合或视图的独占锁。对集合的所有后续操作都必须等到 create
释放该锁为止。create
通常会短暂占用该锁。
创建视图需获得数据库中 system.views
集合的额外独占锁。此锁会阻止创建或修改数据库中的视图,直到命令完成。
在 MongoDB 4.2 之前,create
获得了对父数据库的独占锁,在操作完成之前阻塞对该数据库及其所有集合执行任何操作。
事务
在 4.4 版本中进行了更改。
如果事务不是跨分片写事务,则可以在分布式事务中创建集合和索引。
要在事务中使用 create
,该事务必须使用读关注 "local"
。如果指定 "local"
以外的读关注级别,则该事务将失败。
Stable API
5.0 版本中的更改。
使用stable API V1 时,您无法在create
命令中指定以下字段:
autoIndexId
capped
indexOptionDefaults
max
size
storageEngine
访问控制
如果部署强制执行身份验证/授权,则 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 } )
注意
在此示例中,expireAfterSeconds
被指定为 86400
,这意味着文档在 timestamp
值后 86400
秒过期。请参阅设置时间序列采集 (TTL) 的自动删除。
创建视图
注意
此命令创建的视图不引用物化视图。有关按需物化视图的讨论,请参阅 $merge
。
版本 4.2 中进行了更改。
视图定义pipeline
不能包含$out
或$merge
阶段。 如果视图定义包含嵌套管道(例如视图定义包含$lookup
或$facet
阶段),则此限制也适用于嵌套管道。
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 集合级别选项文档。