Docs 菜单

Docs 主页开发应用程序MongoDB Manual

创建

在此页面上

  • 定义
  • 语法
  • 行为
  • 访问控制
  • 举例
create

显式创建集合或视图。

注意

此命令创建的视图不引用物化视图。有关按需物化视图的讨论,请参阅 $merge

create命令采用以下语法:

注意

从 MongoDB 4.2 开始

MongoDB 删除了 MMAPv 1存储引擎和 create 的 MMAPv 1特定选项flags

db.runCommand(
{
create: <collection or view name>,
capped: <true|false>,
timeseries: {
timeField: <string>,
metaField: <string>,
granularity: <string>
},
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
字符串
新collection或视图的名称。请参阅命名限制。
capped
布尔
可选。要创建固定大小集合,请将该字段设为 true。如果将该字段设为 true,则还须在 size 字段中设置最大大小。
timeseries.timeField
字符串
创建时间序列集合时需要。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须具有有效 BSON 日期,以作为 timeField 的值。
timeseries.metaField
字符串

可选。包含每个时间序列文档中元数据的字段的名称。指定字段中的元数据应用于标识一系列唯一文档的数据。元数据应该很少改变(如果有的话)。

指定字段的名称可能不是 _id 或与 timeseries.timeField 不同。该字段可为除数组之外的任意类型。

timeseries.granularity
字符串
可选。 可能的值为"seconds" (默认值)、 "minutes""hours" 。 将粒度设置为与连续传入测量之间的时间跨度最接近的值。 准确设置granularity参数可优化time-series collection中数据的内部存储方式,从而提高性能。
expireAfterSeconds
数字
可选。指定时间序列集合集群化集合中的文档过期的秒数。MongoDB 将自动删除过期文档。
文档

从 MongoDB 5.3 开始,您可以使用集群索引创建集合。使用集群索引创建的集合称为“集群化集合”。

请参阅集群化集合

clusteredIndex 通过以下语法实现:

clusteredIndex: {
key: { <string> },
unique: <boolean>,
name: <string>
}
字段
说明
key
必需。集群索引键字段。必须设置为 { _id: 1 }_id 字段的默认值是自动生成的唯一对象标识符,您也可以设置自己的集群索引键值
unique
必需。必须设置为 true。唯一索引表示集合不会接受集群索引键值与索引中现有值匹配的文档插入或更新。
name
可选。唯一标识集群索引的名称。

5.3 版本中的新增功能

文档

可选。

从 MongoDB 6.0 开始,可使用变更流事件来输出更改前后的文档版本(文档前映像和后映像):

  • 前映像是指被替换、更新或删除之前的文档。已插入的文档没有前映像。

  • 后图像是插入、替换或更新后的文档。 已删除的文档没有后图像。

  • 使用changeStreamPreAndPostImages 、 或db.createCollection() create为集合启用collMod

changeStreamPreAndPostImages 通过以下语法实现:

changeStreamPreAndPostImages: {
enabled: <boolean>
}
enabled
说明
true
启用集合的变更流前像和后像。
false
为集合禁用 change stream 前图像和后图像。

有关变更流输出的完整示例,请参阅使用文档前像和后像的变更流

有关此页面上的create示例,请参阅使用文档的变更流前像和后像创建集合。

6.0 版本中的新功能

autoIndexId
布尔

可选。 指定false可禁用在_id字段上自动创建索引的功能。

重要

从 MongoDB 4.0 开始,在数据库以外的数据库中创建collection时,不能将选项autoIndexId设置为falselocal

自 3.2 版起已弃用

size
整型
可选。指定固定大小集合的最大大小(以字节为单位)。一旦固定大小集合达到其最大大小,MongoDB 就会删除旧文档,为新文档腾出空间。对于固定大小集合,size 字段为必需项,对于其他集合,则忽略该字段。
max
整型
可选。固定大小集合中允许的最大文档数。size限制优先于此限制。如果固定大小集合在达到最大文档数之前达到size限制,则 MongoDB 将删除旧文档。如果您希望使用max限制,请确保固定大小集合所需的size限制足以包含最大数量的文档。
storageEngine
文档

可选。仅适用于 WiredTiger 存储引擎。

允许用户在创建集合时针对每个集合指定存储引擎的配置。storageEngine 选项的值应采用以下形式:

{ <storage-engine-name>: <options> }

在复制过程中,对创建集合时指定的存储引擎配置进行验证并记录到 oplog 中,以支持节点使用不同存储引擎的副本集。

提示

另请参阅:

validator
文档

可选。 允许用户为collection指定验证规则或表达式。有关更多信息,请参阅模式验证。

validator 选项采用指定验证规则或表达式的文档。可以使用与该查询运算符相同的操作符来指定表达式,但 $near$nearSphere$text$where 除外。

注意

  • 更新和插入期间进行验证。现有文档在修改之前不会进行验证检查。

  • 不能为 adminlocalconfig 数据库中的集合指定验证器。

  • 无法为 system.* 集合指定验证器。

validationLevel
字符串

可选。确定 MongoDB 在更新期间将验证规则应用于现有文档的严格程度。

validationLevel
说明
"off"
不对插入或更新进行验证。
"strict"
默认将验证规则应用于所有插入和所有更新。
"moderate"
将验证规则应用于现有有效文档的插入和更新。请勿将规则应用于现有无效文档的更新。
validationAction
字符串

可选。 确定是对无效文档上的error,还是仅对违规行为的warn,但允许插入无效文档。

重要

文档验证仅适用于由 validationLevel 确定的文档。

validationAction
说明
"error"
默认值文档必须在写入之前通过验证。否则,写入操作将失败。
"warn"
文档不必通过验证。如果文档未通过验证,则写入操作将记录验证失败。
indexOptionDefaults
文档

可选。允许用户在创建集合时指定索引的默认配置。

indexOptionDefaults 选项接受 storageEngine 文档,该文档应采用以下形式:

{ <storage-engine-name>: <options> }

在复制过程中,对创建索引时指定的存储引擎配置进行验证并记录到 oplog 中,以支持其成员使用不同存储引擎的副本集。

viewOn
字符串

要从中创建视图的源集合或视图的名称。该名称不是集合或视图的完整命名空间;即不包括数据库名称,并意味着与要创建的视图是同一个数据库。您必须在与源集合相同的数据库中创建视图。

另请参阅 db.createView()

pipeline
阵列

聚合管道阶段组成的数组。 create通过将指定的pipeline应用于viewOn集合或视图来创建视图。

视图定义 pipeline 不能包含 $out$merge 阶段。这一限制也适用于嵌入式管道,例如在 $lookup$facet 阶段中使用的管道。

视图定义是公开的;即视图上的 db.getCollectionInfos()explain 操作将包括定义视图的管道。因此,应避免在视图定义中直接引用敏感字段和值。

另请参阅 db.createView()

collation

指定集合或视图的默认排序规则

排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。

排序规则选项的语法如下:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

指定排序规则时,locale 字段为必填字段;所有其他排序规则字段均为可选字段。有关字段的说明,请参阅排序规则文档

如果在集合级别指定排序规则:

  • 除非索引创建操作显式指定其他排序规则,否则会用该排序规则创建此集合上的索引。

  • 除非明确指定其他排序规则,否则对该集合的操作使用集合的默认排序规则。

    您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。

如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。

对于视图,如果未指定排序规则,则视图的默认排序规则是“简单”二进制比较排序规则。对于集合上的视图,视图不会继承集合的排序规则设置。对于另一个视图上的视图,要创建的视图必须指定相同的排序规则设置。

创建集合或视图后,无法更新其默认排序规则。

有关在创建集合期间指定默认排序规则的示例,请参阅指定排序规则。

writeConcern
文档

可选。表达该操作的写关注的文档。省略以使用默认的写关注。

在分片集群上发出时, 会将 命令及其帮助程序mongos createdb.createCollection() 写关注 转换为"majority"

encryptedFields
文档

可选。为正在创建的集合配置 Queryable Encryption 的文档。

要在集合中使用加密字段,请指定一个新的配置选项。您必须拥有创建和修改集合的权限,才能创建或编辑此配置。

配置包括字段列表及其对应的键标识符、类型和支持的查询。

encryptedFieldsConfig = {
"fields": [
{
"keyId": UUID, // required
"path": String, // path to field, required
"bsonType": "string" | "int" ..., // required
"queries": // optional
[
{ "queryType": "equality" },
]
}
],
"queryPatterns": [ // optional
{"fieldName": queryType, "fieldName": queryType, … }
]
}

有关详细信息,请参阅快速入门

comment
注意到

可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:

注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。

4.4 版本新增

db.createCollection()方法和db.createView()方法封装了create命令。

版本 4.2 中进行了更改

create在操作期间获得指定集合或视图的独占锁。对集合的所有后续操作都必须等到create释放该锁。 create通常会短暂占用此锁。

创建视图需获得数据库中 system.views 集合的额外独占锁。此锁会阻止创建或修改数据库中的视图,直到命令完成。

在 4.4 版本中进行了更改

如果事务不是跨分片写事务,则可以在分布式事务中创建集合和索引。

要在事务中使用create ,该事务必须使用读关注"local" 。如果您指定"local"以外的读关注级别,则事务将失败。

提示

5.0 版本中的更改

使用Stable API V 1时,您不能在create命令中指定以下字段:

  • autoIndexId

  • capped

  • indexOptionDefaults

  • max

  • size

  • storageEngine

如果部署强制执行身份验证/授权,则create需要以下特权:

任务
所需权限
创建固定大小集合

数据库上的createCollection

insert 集合

convertToCapped 集合

createCollection (在数据库中)

创建视图

createCollection (在数据库中)。

但是,如果用户在数据库上具有 createCollection 权限,并在要创建的视图上具有 find 权限,则则该用户须具有以下额外权限:

  • find 源集合或视图上。

  • find位于pipeline中引用的任何其他集合或视图(如有)。

在数据库中拥有 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) 的自动删除。

以下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

以下示例创建了一个启用了changeStreamPreAndPostImages的集合:

db.runCommand( {
create: "temperatureSensor",
changeStreamPreAndPostImages: { enabled: true }
} )

如果图像属于以下情况,则前像和后像不可用于变更流事件

  • 在文档更新或删除操作时未对集合启用。

  • expireAfterSeconds 中设置的前像和后像保留时间后之后被删除。

    • 以下示例将整个集群的expireAfterSeconds设置为100秒:

      use admin
      db.runCommand( {
      setClusterParameter:
      { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } }
      } )
    • 以下示例将特定collection上的expireAfterSeconds设置为100秒:

      use admin
      db.getSiblingDB("my_collection")
      .sensors.watch({ changeStreamOptions:
      { preAndPostImages: { expireAfterSeconds: 100 } } })
    • 以下示例返回当前的 changeStreamOptions 设置,包括 expireAfterSeconds

      db.adminCommand( { getClusterParameter: "changeStreamOptions" } )
    • expireAfterSeconds 设置为 off 可使用默认保留策略:将保留前像和后像,直到从 oplog 中删除对应的变更流事件。

    • 如果变更流事件从 oplog 中删除,则无论 expireAfterSeconds 前映像和后映像保留时间如何,相应的前映像和后映像也会被删除。

其他考量:

  • 启用前像和后像会占用存储空间并增加处理时间。仅在需要时启用前像和后像。

  • 将变更流事件大小限制为小于 16 MB。要限制事件大小,您可以:

    • 将文档大小限制为 8 MB。如果其他 change stream 事件字段(例如 updateDescription)不是很大,则可以在 change stream 输出中同时请求更新前的文档和更新后的文档。

    • 如果其他变更流事件字段(例如 updateDescription)并不大,则仅请求变更流输出中最多 16 MB 的文档的后像。

    • 在以下情况下,仅请求最大 16 MB 的文档的 change stream 输出中的预映像:

      • 文档更新仅影响文档结构或内容的一小部分,

      • 不会引起 replace 变更事件。replace 事件始终包含后像。

  • 要请求前图像,请在db.collection.watch()中将fullDocumentBeforeChange设置为requiredwhenAvailable。要请求后图像,您可以使用相同的方法设置fullDocument

  • 前像被写入 config.system.preimages 集合。

    • config.system.preimages 集合可能会变大。要限制集合大小,可如前文所示为前映像设置 expireAfterSeconds 时间。

    • 前像由后台进程异步删除。

重要

向后不兼容的功能

从 MongoDB 6.0 开始,如果您将文档前图像和后图像用于 change stream,则必须使用 collMod 命令为每个集合禁用 changeStreamPreAndPostImages,然后才能降级到早期 MongoDB 版本。

提示

另请参阅:

注意

此命令创建的视图不引用物化视图。有关按需物化视图的讨论,请参阅 $merge

版本 4.2 中进行了更改

视图定义 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" }
]
)

以下操作将创建一个包含 _idfeedback.managementdepartment 字段的 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 文档 用于特定的 选项。

← convertToCapped