collMod
定义
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>, ... } )
对于 <集合或视图>,指定当前数据库中集合或视图的名称。
选项
更改索引属性
要更改索引选项,指定要更改的现有索引选项的键模式或名称
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> } )
如果索引不存在,命令将报错,错误信息为 "无法找到名称为 <name|keyPattern> 的索引 for ns <db.collection>"。
index索引选项
index可以更改现有索引的以下属性:索引属性描述expireAfterSeconds确定 TTL 集合过期阈值的秒数。[TTL 集合](/docs/manual/tutorial/expire-data/#std-label-ttl-collections)。
如果成功,命令返回一个包含以下内容的文档:
expireAfterSeconds_new,新的expireAfterSeconds值expireAfterSeconds_old,旧的expireAfterSeconds值,如果索引在之前有expireAfterSeconds的值。
修改索引选项
expireAfterSeconds会重置索引的$indexStats。如果您使用 MongoDB 5.0 之前的 TTL 索引,或者如果您想将 MongoDB 5.0 中创建的数据与低于 5.0 的安装同步,请参阅 [使用 NaN 配置的索引](/docs/manual/tutorial/expire-data/#std-label-expireData-warning),以避免配置错误。
TTL 索引
expireAfterSeconds值必须在0和2147483647之间(包含)。hidden一个布尔值,用于确定索引是否从查询计划器中隐藏。[隐藏索引](/docs/manual/core/index-hidden/#std-label-index-type-hidden)。
如果
hidden值发生变化,命令将返回一个包含更改属性旧值和新值的文档:hidden_old和hidden_new。但是,如果
hidden值没有变化(即隐藏已隐藏的索引或取消隐藏已取消隐藏的索引),则命令将省略输出中的hidden_old和hidden_new字段。要隐藏索引,您必须将 featureCompatibilityVersion 设置为
4.4或更高。如果值发生变化,则修改索引选项
hidden会重置索引的$indexStats。prepareUnique一个布尔值,用于确定索引是否接受新的重复条目。
当
prepareUnique为true时,新重复条目会失败并返回 DuplicateKey 错误。生成的索引可以转换为唯一索引。要转换索引,请使用带有unique选项的collMod。如果更新现有索引,使
prepareUnique为true,则不会检查预存在的重复索引条目。新版本6.0.
unique一个布尔值,用于确定索引是否唯一。
false的值不受支持。当
unique为true时,collMod会扫描keyPattern索引以查找重复项,如果没有重复索引条目,则将其转换为唯一索引。如果在初始扫描期间检测到重复项,
collMod会返回CannotConvertIndexToUnique和冲突文档列表。要将具有重复条目的索引转换为唯一索引,请纠正报告的冲突,然后重新运行collMod。要结束转换,请将
prepareUnique设置为false。有关如何将非唯一索引转换为唯一索引的示例,请参阅 [将现有索引转换为唯一索引](/docs/manual/core/index-unique/convert-to-unique/#std-label-index-convert-to-unique)。
新版本6.0.
验证文档
validatorvalidator允许用户为集合指定 验证规则或表达式。验证器(validator)选项接受一个指定验证规则或表达式的文档。您可以使用与查询运算符相同的运算符来指定表达式,但除了
$near、$nearSphere、$text和$where之外。注意
验证发生在更新和插入过程中。现有文档在修改之前不会进行验证检查。
您不能为
admin、local和config数据库中的集合指定验证器。您不能为
system.*集合指定验证器。
validationLevelvalidationLevel决定MongoDB在更新期间对现有文档应用验证规则的程度。"off"- 不进行插入或更新的验证。
"strict"- 默认值 对所有插入和所有更新应用验证规则。
"moderate"- 对插入和现有有效文档的更新应用验证规则。不将规则应用于现有无效文档的更新。
要查看使用
validationLevel的示例,请参阅为现有文档指定验证级别。
validationActionvalidationAction选项确定是否在无效文档上引发错误,还是仅对违规行为发出警告,但允许无效文档。重要
文档验证仅适用于由
validationLevel确定的文档。要查看使用
validationAction的示例,请参阅选择处理无效文档的方式。
修改视图
注意
此命令修改的视图不涉及物化视图。有关按需物化视图的讨论,请参阅$merge。
viewOn基本源集合或视图。视图定义是通过将指定的
pipeline应用到此源来确定的。如果修改在启用访问控制的 MongoDB 部署上运行的视图,则必须指定。
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等价值。粒度bucketRoundingSeconds限制(包含)bucketMaxSpanSeconds限制(包含)秒603600分钟360086400小时864002592000
调整固定集合大小
新版本6.0.
从 MongoDB 6.0 版本开始,您可以调整固定集合的大小。要更改固定集合的最大字节数,请使用 cappedSize 选项。要更改现有固定集合中的最大文档数,请使用 cappedMax 选项。
注意
您不能使用这些命令来调整oplog的大小。请使用replSetResizeOplog代替。
例如,以下命令将capped集合的最大大小设置为100000字节,并将集合中的最大文档数设置为500
db.runCommand( { collMod: <collection>, cappedSize: 100000, cappedMax: 500 } )
带有文档前和后图像的更改流
新版本6.0.
从MongoDB 6.0版本开始,您可以使用更改流事件来输出文档更改前后的版本(文档前后映像)
前映像是文档在替换、更新或删除之前的版本。对于插入的文档没有前映像。
后映像是文档在插入、替换或更新之后的版本。对于删除的文档没有后映像。
使用
db.createCollection()、create或命令为集合启用collMod.changeStreamPreAndPostImages。
要使用collMod为集合启用更改流的前后映像,使用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 } } } } ) 以下示例返回当前的
changeStreamOptions设置,包括expireAfterSecondsdb.adminCommand( { getClusterParameter: "changeStreamOptions" } ) 将
expireAfterSeconds设置为off使用默认保留策略:前后映像保留,直到相应的更改流事件从oplog中删除。如果更改流事件从oplog中删除,则相应的前后映像也将被删除,无论
expireAfterSeconds的前后映像保留时间。
其他注意事项
启用前后映像会消耗存储空间并增加处理时间。只有在需要时才启用前后映像。
将更改流事件的大小限制在小于16兆字节。要限制事件大小,您可以
将文档大小限制在8兆字节。如果其他变更流事件字段,如
updateDescription,不是很大,您可以在变更流输出中同时请求预图像和后图像。如果其他变更流事件字段,如
updateDescription,不是很大,则仅请求16兆字节文档的变更流输出中的后图像。如果
文档更新只影响文档结构或内容的一小部分,并且
不会引发
replace变更事件。一个replace事件总是包含后图像。
要请求预图像,您在
db.collection.watch()中将fullDocumentBeforeChange设置为required或whenAvailable。要请求后图像,使用相同的方法设置fullDocument。预图像被写入到
config.system.preimages集合。集合
config.system.preimages可能会变得很大。为了限制集合大小,您可以像前面所示为预图像设置expireAfterSeconds时间。预图像由后台进程异步删除。
重要
向后不兼容功能
从MongoDB 6.0开始,如果您正在使用文档预图像和后图像进行变更流,则在降级到早期MongoDB版本之前,您必须使用collMod命令为每个集合禁用changeStreamPreAndPostImages。
附加注释
可选。您可以为此命令附加注释。注释必须是一个顶级字段,可以是任何有效的 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。