文档菜单
文档首页
/
MongoDB 手册
/ / /

create

本页内容

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 访问控制
  • 示例
创建

显式创建一个集合或视图。

注意

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

此命令可在以下环境中托管的部署中使用

  • MongoDB Atlas:MongoDB在云中的完全托管服务

注意

此命令支持MongoDB Atlas的所有集群。有关Atlas对所有命令的支持信息,请参阅不受支持的命令。

create命令具有以下语法

注意

MongoDB 6.3增加了bucketMaxSpanSecondsbucketRoundingSeconds参数。要降级到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
字符串
新集合或视图的名称。请参阅命名限制。如果您尝试创建一个已存在的集合或视图,并且为该现有集合或视图提供了相同的选项,则不会执行任何操作,并返回成功。
受限
布尔型
可选。要创建一个受限集合,指定true。如果指定true,则必须在size字段中设置最大大小。
timeseries.timeField
字符串
创建时间序列集合时必填。包含每个时间序列文档中日期的字段名称。时间序列集合中的文档必须将有效的BSON日期作为timeField的值。
timeseries.metaField
字符串

可选。包含每个时间序列文档中元数据的字段名称。指定字段中的元数据应该是用于标记唯一文档序列的数据。元数据很少或几乎不会更改。指定字段的名称不能是_id或与timeseries.timeField相同。该字段可以是任何数据类型。

尽管metaField字段是可选的,但使用元数据可以提高查询优化。例如,MongoDB会自动为新集合在metaFieldtimeField字段上创建复合索引。如果您不为此字段提供值,数据将仅根据时间进行分桶。

timeseries.granularity
字符串

可选,在设置bucketRoundingSecondsbucketMaxSpanSeconds时不要使用。可能的值是seconds(默认)、minuteshours

granularity设置为与连续传入时间戳之间的时间最接近的值。这通过优化MongoDB在集合内部存储数据的方式来提高性能。

有关粒度和分桶间隔的更多信息,请参阅设置时间序列数据的粒度。

timeseries.bucketMaxSpanSeconds
整数

可选,与bucketRoundingSeconds一起使用,作为granularity的替代。设置同一桶中时间戳之间的最大时间。可能的值是1-31536000。如果您设置bucketMaxSpanSeconds,则必须将bucketRoundingSeconds设置为相同的值。

要降级到MongoDB 6.3以下版本,您必须修改集合以使用相应的granularity值,或者删除集合。有关详细信息,请参阅collMod

timeseries.bucketRoundingSeconds
整数

可选,与bucketMaxSpanSeconds一起使用,作为granularity的替代。设置MongoDB设置新桶的最小时间戳时向下舍入的秒数。必须等于bucketMaxSpanSeconds

例如,将这两个参数都设置为1800将新桶向下舍入到最近的30分钟。如果一个时间戳为2023-03-27T18:24:35Z的文档不适合现有的桶,MongoDB将创建一个新的桶,其最小时间为2023-03-27T18:00:00Z,最大时间为2023-03-27T18:30:00Z

expireAfterSeconds
整数
可选。指定时间序列集合或分片集合中文档过期后的秒数。MongoDB会自动删除过期的文档。
clusteredIndex
文档

从MongoDB 5.3版本开始,您可以使用聚簇索引创建集合。聚簇索引存储在与集合相同的WiredTiger文件中。结果集合称为聚簇集合

clusteredIndex字段具有以下语法

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

新功能在版本5.3.

changeStreamPreAndPostImages
文档

可选。

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

  • 前像是替换、更新或删除之前的文档。对于插入的文档没有前像。

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

  • 使用db.createCollection()createcollMod启用changeStreamPreAndPostImages以启用集合的变更流前像和后像。

changeStreamPreAndPostImages具有以下语法

changeStreamPreAndPostImages: {
enabled: <boolean>
}

要为集合启用变更流前像和后像,请将enabled设置为true

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

有关本页上的create示例,请参阅创建具有变更流文档前像和后像的集合

新功能在版本6.0.

size
整数
可选。指定分片集合的最大字节数。一旦分片集合达到其最大大小,MongoDB会删除较旧的文档以为新文档腾出空间。对于分片集合,需要size字段,但对于其他集合则忽略。
max
整数
可选。限制在受限集合中允许的最大文档数量。当受限集合达到 size 限制之前,MongoDB 会删除旧文档。如果您希望使用 max 限制,请确保 size 限制(对于受限集合是必需的)足以包含最大数量的文档。
storageEngine
文档

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

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

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

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

从 MongoDB 7.2 开始,您无法在创建集合时指定 wiredTiger 存储引擎加密选项。要配置 WiredTiger 存储引擎的加密,请参阅 静态加密。

有关更多信息,请参阅 指定存储引擎选项。

validator
文档

可选。允许用户为集合指定 验证规则或表达式

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

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

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

  • 您不能为 system.* 集合指定验证器。

validationLevel
字符串

可选。确定 MongoDB 在更新期间如何严格地应用验证规则到现有文档。

"off"
插入或更新时没有验证。
"strict"
默认 对所有插入和所有更新应用验证规则。
"moderate"
对插入以及现有 有效 文档的更新应用验证规则。不要将规则应用于现有 无效 文档的更新。
validationAction
字符串

可选。确定是否在无效文档上 error 或仅 warn 关于违规情况,但允许无效文档被插入。

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

"error"
默认 写入发生之前,文档必须通过验证。否则,写入操作失败。
"warn"
文档不需要通过验证。如果文档验证失败,则写入操作记录验证失败。
indexOptionDefaults
文档

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

indexOptionDefaults 选项接受一个 storageEngine 文档,其形式如下:

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

在创建索引时指定的存储引擎配置会被验证并记录到操作日志中,以支持使用不同存储引擎的副本集成员。

viewOn
字符串

要创建视图的源集合或视图的名称。该名称不是集合或视图的全命名空间;即不包括数据库名称,并暗示与要创建的视图相同的数据库。您必须在与源集合相同的数据库中创建视图。

另请参阅 db.createView()

pipeline
数组

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

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

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

另请参阅 db.createView()

collation

指定集合或视图的默认 校对

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

collation 选项具有以下语法

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

指定校对时,locale 字段是必需的;所有其他校对字段都是可选的。有关字段的描述,请参阅校对文档

如果您在集合级别指定了校对

  • 该集合上的索引将使用该校对创建,除非索引创建操作明确指定了不同的校对。

  • 该集合上的操作使用集合的默认校对,除非它们明确指定了不同的校对。

    您不能为操作指定多个校对。例如,您不能为每个字段指定不同的校对,或者在执行带有排序的查找时,您不能为查找和排序使用不同的校对。

如果未指定集合或操作中的校对,MongoDB 将使用先前版本中用于字符串比较的简单二进制比较。

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

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

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

writeConcern
文档

可选。一个文档,表示操作的写关注。省略以使用默认写关注。

当在分片集群上执行时,mongos写关注转换为"majority"

encryptedFields
文档

可选。一个文档,用于配置正在创建的集合的可查询加密

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

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

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类型(字符串、整数、对象、数组等)。

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

create 具有以下行为

create 在操作期间对指定的集合或视图获取独占锁。所有后续的集合操作必须等待 create 释放锁。通常情况下,create 仅持有该锁很短的时间。

创建视图需要获取数据库中 system.views 集合的附加独占锁。此锁阻止在命令完成之前创建或修改数据库中的视图。

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

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

提示

另请参阅

如果您使用与现有集合或视图相同的名称和选项运行 create,则 create 返回成功。

已更改在版本5.0.

当使用 稳定API V1 时,您不能在 create 命令中指定以下字段

  • autoIndexId

  • 受限

  • indexOptionDefaults

  • max

  • size

  • storageEngine

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

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

createCollection 数据库,

insert 创建集合的集合

convertToCapped 集合

在数据库上createCollection

创建一个视图

在数据库上createCollection

但是,如果用户有数据库上的创建视图的find权限,用户还必须拥有以下附加权限

具有数据库上内置的readWrite角色的用户具有执行所列操作的必要权限。或者创建一个具有所需角色的用户或者将角色授予现有用户

要创建一个限制为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()createcollMod启用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设置为requiredwhenAvailabledb.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" }
]
)

以下操作创建了一个具有_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选项。

从 MongoDB 7.2 开始,您无法在创建集合时指定 wiredTiger 存储引擎加密选项。要配置 WiredTiger 存储引擎的加密,请参阅 静态加密。

返回

convertToCapped