Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

db.createCollection()

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 访问控制
  • 行为
  • 示例
db.createCollection(name, options)

创建新的集合或视图。 有关视图,另请参阅db.createView()

由于 MongoDB 会在命令中首次引用集合时隐式创建集合,因此该方法主要用于创建使用特定选项的新集合。 例如,您使用db.createCollection()创建固定大小集合,或创建使用文档验证的新集合。

db.createCollection()是数据库命令create的包装器。

此方法可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

注意

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

db.createCollection() 方法具有以下原型形式:

db.createCollection( <name>,
{
capped: <boolean>,
timeseries: { // Added in MongoDB 5.0
timeField: <string>, // required for time series collections
metaField: <string>,
granularity: <string>
},
expireAfterSeconds: <number>,
clusteredIndex: <document>, // Added in MongoDB 5.3
changeStreamPreAndPostImages: <document>, // Added in MongoDB 6.0
size: <number>,
max: <number>,
storageEngine: <document>,
validator: <document>,
validationLevel: <string>,
validationAction: <string>,
indexOptionDefaults: <document>,
viewOn: <string>,
pipeline: <pipeline>,
collation: <document>,
writeConcern: <document>
}
)

db.createCollection() 方法具有以下参数:

Parameter
类型
说明

name

字符串

要创建的集合名称。请参阅命名限制

options

文档

可选。用于创建以下内容配置选项:

  • 固定大小集合

  • 集群化集合

  • 查看

options 文档包含以下字段:

字段
类型
说明

capped

布尔

可选。要创建固定大小集合,请将该字段设为 true。如果将该字段设为 true,则还须在 size 字段中设置最大大小。

timeseries.timeField

字符串

创建时间序列集合时需要。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须具有有效 BSON 日期,以作为 timeField 的值。

timeseries.metaField

字符串

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

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

timeseries.granularity

字符串

可选,如果设置 bucketRoundingSecondsbucketMaxSpanSeconds,请勿使用。可能的值为 seconds(默认值)、minuteshours

granularity 设置为与连续传入的时间戳之间的时间最匹配的值。通过优化 MongoDB 在集合中内部存储数据的方式,可以提高性能。

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

expireAfterSeconds

数字

可选。 指定时间序列集合中的文档过期的秒数。 MongoDB会自动删除过期文档。

size

数字

可选。指定固定大小集合的最大大小(以字节为单位)。一旦固定大小集合达到其最大大小,MongoDB 就会删除旧文档,为新文档腾出空间。对于固定大小集合,size 字段为必需项,对于其他集合,则忽略该字段。

max

数字

可选。固定大小集合中允许的最大文档数。size限制优先于此限制。如果固定大小集合在达到最大文档数之前达到size限制,则 MongoDB 将删除旧文档。如果您希望使用max限制,请确保固定大小集合所需的size限制足以包含最大数量的文档。

storageEngine

文档

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

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

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

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

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

validator

文档

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

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

要了解如何使用模式验证创建集合,请参阅JSON schema。

validationLevel

字符串

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

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

validationAction

字符串

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

重要提示:文档验证仅适用于由 validationLevel 确定的文档。

indexOptionDefaults

文档

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

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

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

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

viewOn

字符串

要从中创建视图的源集合或视图的名称。有关详细信息,请参阅db.createView()

pipeline

阵列

聚合管道阶段组成的数组。db.createView()将指定的 pipeline 应用于 viewOn 集合或视图,从而创建视图。有关详细信息,请参阅db.createView()

collation

文档

为集合指定默认排序规则

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

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

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

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

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

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

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

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

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

对于集合,只能在创建集合时指定排序规则。设置后,无法修改集合的默认排序规则。

有关示例,请参阅指定排序规则。

writeConcern

文档

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

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

如果部署强制执行身份验证/授权,则 db.createCollection() 需要以下权限:

任务
所需权限

创建固定大小集合

数据库上的createCollection

insert 集合

convertToCapped 集合

createCollection (在数据库中)

创建视图

createCollection (在数据库中)。

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

  • find 源集合或视图上。

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

在数据库中拥有 readWrite 内置角色的用户具有运行列表操作所需的特权。创建一个拥有所需角色的用户,或者将该角色授予现有用户

版本 4.2 中进行了更改

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

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

在 MongoDB 4.2 之前,db.createCollection() 获得了对父数据库的独占锁,在操作完成之前阻塞对该数据库及其所有集合执行任何操作。

在 4.4 版本中进行了更改

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

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

提示

另请参阅:

固定大小集合具有最大大小或文档数,可以防止其增长超过最大阈值。所有固定大小集合都必须指定最大大小,也可以指定最大文档数。如果集合在达到最大文档计数之前达到最大大小限制,MongoDB 会删除较旧的文档。考虑以下示例:

db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )

此命令创建名为 log 的集合,最大大小为 5 MB,最多包含 5000 份文档。

有关固定大小集合的更多信息,请参阅固定大小集合

要创建捕捉过去 24 小时天气数据的时间序列集合,请发出此命令:

db.createCollection(
"weather24h",
{
timeseries: {
timeField: "timestamp",
metaField: "data",
granularity: "hours"
},
expireAfterSeconds: 86400
}
)

具有验证功能的集合会将每个插入或更新的文档与validator选项中指定的条件进行比较。 根据validationLevelvalidationAction ,如果文档不符合指定条件,MongoDB 要么返回警告,要么拒绝插入或更新文档。

以下示例使用 JSON schema 验证器创建contacts集合:

db.createCollection( "contacts", {
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
email: {
bsonType : "string",
pattern : "@mongodb\.com$",
description: "must be a string and match the regular expression pattern"
},
status: {
enum: [ "Unknown", "Incomplete" ],
description: "can only be one of the enum values"
}
}
} }
} )

使用验证器后,以下插入操作将无法通过验证:

db.contacts.insertOne( { name: "Amanda", status: "Updated" } )

该方法返回错误:

Uncaught:
MongoServerError: Document failed validation
Additional information: {
failingDocumentId: ObjectId("61a8f4847a818411619e952e"),
details: {
operatorName: '$jsonSchema',
schemaRulesNotSatisfied: [
{
operatorName: 'properties',
propertiesNotSatisfied: [
{
propertyName: 'status',
description: 'can only be one of the enum values',
details: [ [Object] ]
}
]
},
{
operatorName: 'required',
specifiedAs: { required: [ 'phone' ] },
missingProperties: [ 'phone' ]
}
]
}
}

要查看集合的验证规范,请使用db.getCollectionInfos()

提示

另请参阅:

版本 3.4 中的新增功能

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

您可在集合或视图级别指定排序规则。例如,以下操作会创建一个集合,并为该集合指定排序规则(请参阅排序规则文档以查看排序规则字段的描述):

db.createCollection( "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() 创建集合时,可以指定特定于集合的storage engine 配置选项。考虑以下操作:

db.createCollection(
"users",
{ storageEngine: { wiredTiger: { configString: "<option>=<setting>" } } }
)

此操作创建一个名为 users 的新集合,其中包含 MongoDB 将传递到 wiredTiger 存储引擎的特定配置字符串。

例如,要为collection中的文件块指定zlib usersblock_compressor压缩器,请使用以下命令设置 选项:

db.createCollection(
"users",
{ storageEngine: { wiredTiger: { configString: "block_compressor=zlib" } } }
)

后退

db.commandHelp