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

collMod

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 选项
  • 访问控制
  • 行为
  • 示例
collMod

collMod 可以让您向集合添加选项或修改视图定义。

提示

mongosh 中,还可以通过 hideIndex()unhideIndex()辅助方法运行此命令。

辅助方法对 mongosh 用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。

注意

此命令修改的视图并非指的是物化视图。有关按需物化视图的讨论,请参阅 $merge

此命令可用于以下环境中托管的部署:

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

注意

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

该命令具有以下语法:

注意

从 MongoDB 4.2 开始

  • collMod命令的noPaddingusePowerOf2Sizes MMAPv 1选项已删除。

  • 视图定义pipeline不能包含$out$merge阶段。 如果视图定义包含嵌套管道(例如视图定义包含$lookup$facet阶段),则此限制也适用于嵌套管道。

db.runCommand( { collMod: <collection or view>, <option1>: <value1>, <option2>: <value2> ... } )

对于 <collection or view>,指定当前数据库中集合或视图的名称。

index

index选项可以更改现有索引的以下属性:

索引属性
说明

expireAfterSeconds

用于确定 TTL 集合过期阈值的秒数。

如果成功,该命令将返回一个文档,其中包含已更改属性的旧值和新值: expireAfterSeconds_oldexpireAfterSeconds_new

只能修改现有的TTL索引;即具有现有expireAfterSeconds属性的索引。 如果索引没有现有的expireAfterSeconds属性,则操作会出错并no expireAfterSeconds field to update

修改索引选项 expireAfterSeconds 会重置该索引的 $indexStats

如果您使用 MongoDB 5.0 之前版本创建的 TTL 索引,或者要将 MongDB 5.0 创建的数据与之前版本同步,请参阅使用 NaN 配置索引,以避免错误配置问题。

TTL 索引 expireAfterSeconds 值必须介于 02147483647(包含两者)之间。

hidden

确定索引是否对查询计划器隐藏的布尔值。

如果 hidden 值发生更改,该命令将返回一个文档,其中包含已更改属性的旧值和新值:hidden_oldhidden_new

但是,如果 hidden 值没有变化(即隐藏已隐藏的索引或取消隐藏已取消隐藏的索引),该命令会从输出中忽略 hidden_oldhidden_new 字段。

要隐藏索引,必须将 featureCompatibilityVersion 设置为 4.4 或更大。

如果该值发生变化,修改索引选项 hidden 会重置索引的 $indexStats

要更改索引选项,请指定现有索引的键模式或名称,以及想要更改的一个或多个索引选项:

db.runCommand( {
collMod: <collection>,
index: {
keyPattern: <index_spec> || name: <index_name>,
expireAfterSeconds: <number>, // If changing the TTL expiration threshold
hidden: <boolean> // If changing the visibility of the index from the query planner
}
} )
validator

版本 3.2 中的新增功能

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

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

注意

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

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

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

validationLevel

版本 3.2 中的新增功能

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

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

版本 3.2 中的新增功能

validationAction选项确定是对无效文档进行error ,还是仅warn违规但允许无效文档。

重要

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

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

要查看collection的验证规范,请使用db.getCollectionInfos()方法。

注意

此命令修改的视图并非指的是物化视图。有关按需物化视图的讨论,请参阅 $merge

viewOn

视图的根本的源集合或视图。 视图定义是通过将指定的pipeline应用于此源来确定的。

如果在运行访问控制的 MongoDB 部署上修改视图,则需使用此命令。

pipeline

定义视图聚合管道

注意

视图定义pipeline不能包含$out$merge阶段。 如果视图定义包含嵌套管道(例如视图定义包含$lookup$facet阶段),则此限制也适用于嵌套管道。

如果在运行访问控制的 MongoDB 部署上修改视图,则需使用此命令。

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

db.runCommand( {
collMod: "myView",
viewOn: "activities",
pipeline: [
{ $match: { status: "Q" } },
{ $project: { user: 1, date: 1, description: 1} } ]
} )

要启用自动删除文档功能或更改现有时间序列集合expireAfterSeconds参数值,请发出以下collMod命令:

db.runCommand({
collMod: <collection>,
expireAfterSeconds: <Number> || "off"
})

expireAfterSeconds字段必须是以下任一项:

  • 非负十进制数 ( >=0 )

  • 字符串"off"

数字指定文档过期的秒数。 字符串"off"会删除expireAfterSeconds参数并禁用自动删除。

comment

可选。您可以为该命令附加注释。评论必须是顶层字段,可以是任何有效的 BSON 类型。您指定的注释会与该命令的记录一起出现在以下位置:

w

可选。一份表达 collMod 命令的写关注文档。

省略以使用默认的写关注。

如果部署强制执行身份验证/授权,则您必须具有以下权限才能运行collMod命令:

任务
所需权限

修改非固定大小集合

collMod 在数据库中

修改视图

collMod 在数据库中以及:

  • 要修改的视图上无 find

  • 针对该视图的 find,从而对源集合/视图执行修改和 find

内置角色dbAdmin提供所需的特权。

collMod 命令在操作期间获取指定集合的集合锁。

以下示例更新 user_log 集合上现有 TTL 索引 { lastAccess: 1 }expireAfterSeconds 属性。该索引当前的 expireAfterSeconds 属性设置为 1800 秒(或 30 分钟),示例将该值更改为 3600秒(或 60 分钟)。

db.runCommand({
collMod: "user_log",
index: {
keyPattern: { lastAccess: 1 },
expireAfterSeconds: 3600
}
})

如果成功,该操作将返回一个文档,其中包含已更改属性的旧值和新值:

{ "expireAfterSeconds_old" : 1800, "expireAfterSeconds_new" : 3600, "ok" : 1 }

注意

要隐藏索引,必须将 featureCompatibilityVersion 设置为 5.0 或更大。

下面的示例隐藏了 orders 集合上的现有索引。具体而言,该操作会从查询规划器中隐藏具有规范 { shippedDate: 1 } 的索引。

db.runCommand({
collMod: "orders",
index: {
keyPattern: { shippedDate: 1 },
hidden: true
}
})

如果成功,该操作将返回一个文档,其中包含已更改属性的旧值和新值:

{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }

注意

如果操作成功但hidden值未更改(即 隐藏已隐藏的索引或取消隐藏已取消隐藏的索引),该命令会从输出中忽略hidden_oldhidden_new字段。

要隐藏文本索引,您必须通过 name 而非通过 keyPattern 指定该索引。

以下示例将验证器添加到名为contacts的现有集合中。

注意

MongoDB 3.6添加了$jsonSchema操作符以支持 JSON schema 验证。

db.runCommand( { collMod: "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"
}
}
} },
validationLevel: "moderate",
validationAction: "warn"
} )

通过moderate validationLevel ,MongoDB 将验证规则应用于插入操作以及对已满足验证条件的现有文档的更新操作。 不检查对不满足验证标准的现有文档的更新的有效性。

通过warn validationAction ,MongoDB 会记录任何违规行为,但允许继续进行插入或更新。

例如,以下插入操作违反了验证规则。

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

但是,由于validationAction只是warn , MongoDB仅记录验证违规消息并允许操作继续:

2017-12-01T12:31:23.738-05:00 W STORAGE [conn1] Document would fail validation collection: example.contacts doc: { _id: ObjectId('5a2191ebacbbfc2bdc4dcffc'), name: "Amanda", status: "Updated" }

有关更多信息,请参阅模式验证。

后退

cloneCollectionAsCapped