定义
collModcollMod可以让您向集合添加选项或修改视图定义。提示
在
mongosh中,还可以通过hideIndex()和unhideIndex()辅助方法运行此命令。辅助方法对
mongosh用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。注意
collMod修改的视图并非指的是物化视图。有关按需物化视图的讨论,请参阅$merge。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
db.runCommand( { collMod: <collection or view>, <option1>: <value1>, <option2>: <value2>, ... } )
对于 <collection or view>,指定当前数据库中集合或视图的名称。
选项
更改索引属性
要更改索引选项,请指定想要更改的索引选项的现有键模式或名称:
db.runCommand( { collMod: <collection>, index: { keyPattern: <index_spec> | name: <index_name>, expireAfterSeconds: <number>, // Set the TTL expiration threshold hidden: <boolean>, // Change index visibility in the query planner prepareUnique: <boolean>, // Reject new duplicate index entries unique: <boolean> // Convert an index to a unique index }, dryRun: <boolean> } )
如果索引不存在,该命令将出错并显示以下消息:"cannot find index <name|keyPattern> for ns <db.collection>"。
indexindex选项可以更改现有索引的以下属性:索引属性说明expireAfterSeconds用于确定 TTL 集合过期阈值的秒数。
如果成功,该命令将返回一份包含以下内容的文档:
expireAfterSeconds_new,expireAfterSecondsexpireAfterSeconds_old,expireAfterSeconds的旧值(如果索引之前设置了expireAfterSeconds的值)。
修改索引选项
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。prepareUnique一个布尔值,用于确定索引是否接受新的重复条目。
当
prepareUnique为true时,新的重复条目会失败并出现 DuplicateKey 错误。由此产生的索引可转换为唯一索引。要转换索引,使用collMod和unique选项。如果更新现有索引使得
prepareUnique为true,则不会检查该索引是否存在预先存在的重复索引条目。6.0 版本中的新功能。
unique确定索引是否唯一的布尔值。
不支持
false的值。当
unique为true时,collMod会扫描keyPattern索引有无重复项,如果没有重复索引条目,则将其转换为唯一索引。如果在初始扫描期间检测到重复条目,
collMod将返回CannotConvertIndexToUnique和冲突文档列表。要将具有重复条目的索引转换为唯一索引,请更正所有报告的冲突并重新运行collMod。要结束转换,请将
prepareUnique设置为false。要查看如何将非唯一索引转换为唯一索引的示例,请参阅将现有索引转换为唯一索引。
6.0 版本中的新功能。
验证文档
validatorvalidator允许用户为集合指定验证规则或表达式。validator选项采用指定验证规则或表达式的文档。可以使用与该查询运算符相同的操作符来指定表达式,但$near、$nearSphere、$text和$where除外。注意
更新和插入期间进行验证。现有文档在修改之前不会进行验证检查。
不能为
admin、local和config数据库中的集合指定验证器。无法为
system.*集合指定验证器。
validationLevelvalidationLevel确定 MongoDB 在更新期间将验证规则应用于现有文档的严格程度。"off"- 不对插入或更新进行验证。
"strict"- 默认将验证规则应用于所有插入和所有更新。
"moderate"- 将验证规则应用于现有有效文档的插入和更新。请勿将规则应用于现有无效文档的更新。
要查看使用
validationLevel的示例,请参阅为现有文档指定验证级别。
validationActionvalidationAction选项确定是否对无效文档进行error,或者仅warn违反但允许无效文档。重要
文档验证仅适用于由
validationLevel确定的文档。要查看使用
validationAction的示例,请参阅选择如何处理无效文档。
修改视图
注意
此命令修改的视图并非指的是物化视图。有关按需物化视图的讨论,请参阅 $merge。
pipeline如果在运行访问控制的 MongoDB 部署上修改视图,则需使用此命令。
视图定义是公开的;即视图上的
db.getCollectionInfos()和explain操作将包括定义视图的管道。因此,应避免在视图定义中直接引用敏感字段和值。
db.runCommand( { collMod: "myView", viewOn: "activities", pipeline: [ { $match: { status: "Q" } }, { $project: { user: 1, date: 1, description: 1} } ] } )
修改时间序列集合
expireAfterSeconds要启用自动删除文档或修改时间序列集合的当前过期时间间隔,请更改
expireAfterSeconds值:db.runCommand( { collMod: <collection>, expireAfterSeconds: <number> | "off" } ) 将
expireAfterSeconds设定为"off"可禁用自动删除,或设定为非负十进制数 (>=0) 以指定文档过期的秒数。
granularity要修改时间序列集合的粒度,可以将
timeseries.granularity从较短的时间单位增加到较长的时间单位:db.runCommand( { collMod: "weather24h", timeseries: { granularity: "seconds" | "minutes" | "hours" } } ) 要更新自定义分桶参数
bucketRoundingSeconds和bucketMaxSpanSeconds而不是granularity,请将这两个自定义参数包含在collMod命令中并将它们设置为相同的值:db.runCommand( { collMod: "weather24h", timeseries: { bucketRoundingSeconds: 86400, bucketMaxSpanSeconds: 86400 } } ) 您无法减少粒度间隔或自定义分桶值。
重要
如果任何时间序列集合明确指定了自定义分桶参数
bucketMaxSpanSeconds和bucketRoundingSeconds,则无法降级到 MongoDB 6.3 以下。如果可能,请转换为相应的granularity。如果不能,则必须在降级之前删除该集合。要将集合从自定义分桶转换为
granularity,bucketMaxSpanSeconds和bucketRoundingSeconds值都必须小于或等于granularity等效值:granularitybucketRoundingSeconds限值(包含本数)bucketMaxSpanSeconds限值(包含本数)seconds60
3600
minutes3600
86400
hours86400
2592000
调整固定大小集合的大小
6.0 版本中的新功能。
从 MongoDB 6.0 开始,您可以重新调整固定大小集合。要更改固定大小集合的最大字节数,请使用 cappedSize 选项。要更改现有固定大小集合中的最大文档数,请使用 cappedMax 选项。
注意
您不能使用这些命令来调整 oplog 的大小。请改用 replSetResizeOplog。
例如,以下命令将固定大小集合的大小上限设置为 100000 字节,并将集合中的最大文档数设置为 500:
db.runCommand( { collMod: <collection>, cappedSize: 100000, cappedMax: 500 } )
附带文档前映像和后映像的变更流
6.0 版本中的新功能。
从 MongoDB 6.0 开始,可使用变更流事件来输出更改前后的文档版本(文档前映像和后映像):
前映像是指被替换、更新或删除之前的文档。已插入的文档没有前映像。
后图像是插入、替换或更新后的文档。 已删除的文档没有后图像。
changeStreamPreAndPostImages使用db.createCollection()create、 或collMod为集合启用 。示例,使用collMod命令时:db.runCommand( { collMod: <collection>, changeStreamPreAndPostImages: { enabled: true } } )
要使用 collMod 启用集合的 change stream 前图像和后图像,请使用 changeStreamPreAndPostImages 字段:
db.runCommand( { collMod: <collection>, changeStreamPreAndPostImages: { enabled: <boolean> } } )
要启用集合的变更流前图像和后图像,请将 changeStreamPreAndPostImages 设定为 true。例如:
db.runCommand( { collMod: "orders", changeStreamPreAndPostImages: { enabled: true } } )
要禁用集合的变更流前后映像,请将 changeStreamPreAndPostImages 设为 false。例如:
db.runCommand( { collMod: "orders", changeStreamPreAndPostImages: { enabled: false } } )
如果图像属于以下情况,则前像和后像不可用于变更流事件:
在文档更新或删除操作时未对集合启用。
在
expireAfterSeconds中设置的前像和后像保留时间后之后被删除。以下示例将整个集群上的
expireAfterSeconds设置为100秒:use admin db.runCommand( { setClusterParameter: { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } } } ) 注意
setClusterParameterMongoDB Atlas集群不支持 命令。有关Atlas支持所有命令的信息,请参阅Atlas不支持的命令。以下示例返回当前的
changeStreamOptions设置,包括expireAfterSeconds:db.adminCommand( { getClusterParameter: "changeStreamOptions" } ) 将
expireAfterSeconds设置为off可使用默认保留策略:将保留前像和后像,直到从 oplog 中删除对应的变更流事件。如果变更流事件从 oplog 中删除,则无论
expireAfterSeconds前映像和后映像保留时间如何,相应的前映像和后映像也会被删除。
其他考量:
启用前像和后像会占用存储空间并增加处理时间。仅在需要时启用前像和后像。
将变更流事件大小限制为小于 16 MiB。要限制事件大小,您可以:
将文档大小限制为 8 MB。如果其他 change stream 事件字段(例如
updateDescription)不是很大,则可以在 change stream 输出中同时请求更新前的文档和更新后的文档。如果其他变更流事件字段(例如
updateDescription)并不大,则仅请求变更流输出中最多 16 MiB 的文档的后像。在以下情况下,仅请求变更流输出中最多 16 MiB 的文档的前像:
文档更新仅影响文档结构或内容的一小部分,且
不会引起
replace变更事件。replace事件始终包含后像。
要请求前图像,请在
db.collection.watch()中将fullDocumentBeforeChange设置为required或whenAvailable。要请求后图像,您可以使用相同的方法设置fullDocument。前像被写入
config.system.preimages集合。config.system.preimages集合可能会变大。要限制集合大小,可如前文所示为前映像设置expireAfterSeconds时间。前像由后台进程异步删除。
重要
向后不兼容的功能
从 MongoDB 6.0 开始,如果您为变更流使用文档前像和后像,则必须使用 collMod 命令为每个集合禁用 changeStreamPreAndPostImages,然后才能降级到更早版本的 MongoDB。
提示
有关变更流事件和输出,请参阅变更事件。
要查看集合的变化,请参阅
db.collection.watch()。有关变更流输出的完整示例,请参阅使用文档前像和后像的变更流。
添加评论
可选。您可以为该命令附加注释。评论必须是顶层字段,可以是任何有效的 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 指定该索引。