collMod
定义
collMod
collMod
可以让您向集合添加选项或修改视图定义。提示
在
mongosh
中,还可以通过hideIndex()
和unhideIndex()
辅助方法运行此命令。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。注意
此命令修改的视图并非指的是物化视图。有关按需物化视图的讨论,请参阅
$merge
。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
注意
从 MongoDB 4.2 开始
db.runCommand( { collMod: <collection or view>, <option1>: <value1>, <option2>: <value2> ... } )
对于 <collection or view>
,指定当前数据库中集合或视图的名称。
选项
索引选项
index
index
选项可以更改现有索引的以下属性:索引属性说明expireAfterSeconds
用于确定 TTL 集合过期阈值的秒数。
如果成功,该命令将返回一个文档,其中包含已更改属性的旧值和新值:
expireAfterSeconds_old
和expireAfterSeconds_new
。只能修改现有的TTL索引;即具有现有
expireAfterSeconds
属性的索引。 如果索引没有现有的expireAfterSeconds
属性,则操作会出错并no expireAfterSeconds field to update
。修改索引选项
expireAfterSeconds
会重置该索引的$indexStats
。如果您使用 MongoDB 5.0 之前版本创建的 TTL 索引,或者要将 MongDB 5.0 创建的数据与之前版本同步,请参阅使用 NaN 配置索引,以避免错误配置问题。
TTL 索引
expireAfterSeconds
值必须介于0
和2147483647
(包含两者)之间。hidden
确定索引是否对查询计划器隐藏的布尔值。
如果
hidden
值发生更改,该命令将返回一个文档,其中包含已更改属性的旧值和新值:hidden_old
和hidden_new
。但是,如果
hidden
值没有变化(即隐藏已隐藏的索引或取消隐藏已取消隐藏的索引),该命令会从输出中忽略hidden_old
和hidden_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
除外。注意
更新和插入期间进行验证。现有文档在修改之前不会进行验证检查。
不能为
admin
、local
和config
数据库中的集合指定验证器。无法为
system.*
集合指定验证器。
validationLevel
版本 3.2 中的新增功能。
validationLevel
确定MongoDB在更新期间将验证规则应用于现有文档的严格程度。"off"
- 不对插入或更新进行验证。
"strict"
- 默认将验证规则应用于所有插入和所有更新。
"moderate"
- 将验证规则应用于现有有效文档的插入和更新。请勿将规则应用于现有无效文档的更新。
validationAction
版本 3.2 中的新增功能。
validationAction
选项确定是对无效文档进行error
,还是仅warn
违规但允许无效文档。重要
文档验证仅适用于由
validationLevel
确定的文档。"error"
- 默认值文档必须在写入之前通过验证。否则,写入操作将失败。
"warn"
- 文档不必通过验证。如果文档未通过验证,则写入操作将记录验证失败。
要查看collection的验证规范,请使用db.getCollectionInfos()
方法。
视图
注意
此命令修改的视图并非指的是物化视图。有关按需物化视图的讨论,请参阅 $merge
。
pipeline
如果在运行访问控制的 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
参数并禁用自动删除。
添加评论
可选。您可以为该命令附加注释。评论必须是顶层字段,可以是任何有效的 BSON 类型。您指定的注释会与该命令的记录一起出现在以下位置:
mongod 日志消息,位于
attr.command.cursor.comment
字段中。command.comment
字段中的数据库分析器输出。currentOp
输出,在command.comment
字段。
写关注
可选。一份表达 collMod
命令的写关注文档。
省略以使用默认的写关注。
访问控制
如果部署强制执行身份验证/授权,则您必须具有以下权限才能运行collMod
命令:
内置角色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_old
和hidden_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" }
有关更多信息,请参阅模式验证。