MongoDB 6.0中的兼容性变化
本页面介绍了MongoDB 6.0中引入的可能影响与旧版本MongoDB兼容性的更改。
MongoDB 6.0是一个主要版本,这意味着它支持MongoDB Atlas和本地部署。MongoDB 6.0包括MongoDB快速版本5.1、5.2和5.3中引入的更改。本页面介绍了这些快速发布和MongoDB 6.0中引入的兼容性更改。
要了解有关Major和Rapid版本之间差异的更多信息,请参阅MongoDB版本控制。
集合
allowDiskUse变化
从MongoDB 6.0开始,默认情况下,需要超过100兆字节内存才能将临时文件写入磁盘的管道阶段。在MongoDB的早期版本中,您必须将{ allowDiskUse: true }传递给单个find和aggregate命令才能启用此行为。
单个find和aggregate命令可能会通过以下任一方式覆盖allowDiskUseByDefault参数:
- 当
allowDiskUseByDefault设置为false - 当
allowDiskUseByDefault设置为true
更改流
从MongoDB 5.3开始,在范围迁移期间,不会生成更改流事件以更新孤儿文档。
索引
最后一个剩余的碎片密钥索引不能无意中删除
从MongoDB 6.0开始,将"*"传递给dropIndexes或db.collection.dropIndexes()将删除除_id索引和最后一个剩余的碎片键索引(如果存在)以外的所有索引。尝试显式删除最后一个剩余的分键索引会引发错误
现有索引可以在索引构建期间删除
从MongoDB 5.2开始,您可以使用dropIndexes或db.collection.dropIndexes()在同一集合上删除现有索引,即使正在构建索引。在早期版本中,尝试在正在进行的索引构建期间删除不同的索引会导致BackgroundOperationInProgressForNamespace错误。
2dsphere文档索引键
为了防止内存不足错误,indexMaxNumGeneratedKeysPerDocument限制了为单个文档生成的2dsphere索引密钥的最大数量。
请参阅indexMaxNumGeneratedKeysPerDocument。
移除了传统的mongoshell
MongoDB 6.0中删除了mongo shell。替代品是 mongosh.
平台支持
从MongoDB 5.1.2开始,不再支持以下平台:
社区版
- RHEL-72-s390x
正则表达式
$regex查找查询 不再忽略无效的注册表达式
从MongoDB 5.1开始,无效的$regex options选项不再被忽略。此更改使$regex options与在aggregate命令和投影查询中使用$regex更一致。
$regex架构验证错误行为
从MongoDB 5.1开始,如果集合具有包含无效$regex options的模式验证规则,则服务器:
删除了操作员
从MongoDB 5.1开始,删除这些遗留查询运算符:
| 删除了操作员 | 替代品 |
|---|---|
| $评论 | cursor.comment() |
| $解释 | cursor.explain() |
| $提示 | cursor.hint() |
| 最大值 | cursor.max() |
| $maxTimeMS | cursor.maxTimeMS() |
| 最小 | cursor.min() |
| $orderby | cursor.sort() |
| $查询 | 查看光标方法 |
| $returnKey | cursor.returnKey() |
| $show磁盘Loc | cursor.showRecordId() |
db.getLastError() |
看旧版操作码已删除 |
db.getLastErrorObj() |
看旧版操作码已删除 |
getLastError |
看旧版操作码已删除 |
删除了选项
MongoDB 6.0删除 了 --cpu mongod 选项.
移除了参数
MongoDB 6.0删除了以下服务器参数:
| 删除了参数 | 描述 |
|---|---|
--tlsFIPSMode |
此选项已从MongoDB社区版中删除。它有MongoDB企业版。FIPS不是MongoDB社区版中支持的功能。如果您的安装无论如何都使用了FIPS,则在升级之前,您需要重新配置TLS/SSL连接。 |
TTL expireAfterSeconds设置为NaN时的行为
将TTL expireAfterSeconds设置为NaN会经历从MongoDB 4.4到MongoDB 6.0的行为变化,这会影响MongoDB 4.4及更早版本的初始同步以及MongoDB 4.4及更早版本的mongorestore。执行任何这些操作都会导致将值为NaN的expireAfterSeconds视为值为0的expireAfterSeconds。因此,可能会发生文档立即过期的情况。
副本集
启动或添加碎片时,断言群集范围写入关注已设置
从MongoDB 5.1开始,在启动、重新启动或添加shard server withshsh.addShard()时,必须设置集群宽写入关注(CWWC)。
如果未设置CWWC,并且碎片配置为默认写入问题为{ w : 1 },则碎片服务器将无法启动或添加,并返回错误。
有关如何计算默认写入问题的详细信息,请参阅默认写入问题计算。
rs.reconfig集群宽写入问题验证
从MongoDB 5.1开始,您必须先设置集群宽写入关注(CWWC),然后发布任何reconfigs,否则将更改新副本集成员的默认写入关注。
安全
群集内身份验证
从MongoDB 5.3开始,SCRAM-SHA-1不能用于集群内身份验证。仅支持SCRAM-SHA-256。
在之前的MongoDB版本中,SCRAM-SHA-1和SCRAM-SHA-256都可以用于集群内身份验证,即使SCRAM没有显式启用。
FIPS模式默认SCRAM-SHA-1身份验证关闭
从MongoDB 5.1开始,在FIPS模式下运行的实例默认禁用SCRAM-SHA-1身份验证机制。您可以使用setParameter.authenticationMechanisms命令启用SCRAM-SHA-1身份验证机制。
此更改不会影响面向MongoDB setFeatureCompatibilityVersion 4.0+的驱动程序。
时间序列集
警告:
如果您在MongoDB 5.1或更高版本中创建分片时间序列集合,则降级到早于MongoDB 5.0.4的版本将导致数据丢失。
在降级到早于5.0.4的版本之前,请删除所有分片时间序列集合。
时间序列集合的次要索引
如果时间序列集合上有辅助索引,并且您需要降级功能兼容性版本(FCV),您必须首先删除与降级FCV不兼容的任何辅助索引。请参阅setFeatureCompatibilityVersion。
一般变化
弃用
| 不建议使用的 | 描述 |
|---|---|
db.collection.reIndex() |
MongoDB v6.0不建议使用db.collection.reIndex()方法。 |
reIndex |
在MongoDB v6.0中不建议使用reIndex命令。 |
| 简单网络管理协议(SNMP) | 从MongoDB 6.0开始,SNMP已被弃用,并将在下一个版本中被删除。要监控您的部署,请使用MongoDB运营经理。 |
$mod错误行为
从MongoDB 5.1(以及5.0.4和4.4.10)开始,如果divisor或remainder计算为某些值,$mod运算符将返回错误。请参阅$mod行为。
旧版操作码已删除
MongoDB 6.0取消了对以下传统操作码和数据库命令的支持:
警告:
升级驱动程序
为了避免因删除这些操作码而中断,请将驱动程序升级到最新版本。
如果您尝试使用MongoDB 5.1或更新的mongo shell连接到MongoDB 3.4或更早版本的mongod实例,您将收到如下错误消息:
Connection handshake failed. Is your mongod 3.4 or older?
:: caused by :: network error while attempting to run command
'isMaster' on host '127.0.0.1:27017'
mongod对旧操作码的响应
自MongoDB 3.6以来,MongoDB驱动程序一直使用OP_MSG而不是OP_QUERY和其他传统操作码和命令
从MongoDB 6.0开始:
mongod将关闭连接,不会响应:mongod将保持连接打开状态,并返回以下错误:笔记:
OP_QUERY RPC命令
OP_QUERY RPC协议可用于以下命令:
_isSelfauthenticatebuildinfobuildInfohelloismasterisMastersaslContinuesaslStart
删除了服务器端JavaScript的不建议使用的数组和字符串函数
MongoDB 6.0将用于服务器端JavaScript、$accumulator、$function和$where表达式的内部JavaScript引擎从MozJS-60升级到MozJS-91。MozJS-60中存在的几个已弃用的非标准数组和字符串函数在MozJS-91中被删除。
有关已删除的数组和字符串函数的完整列表,请参阅本页的下一节。
笔记:
仅删除静态函数
只有静态JavaScript函数被删除。仍然可以使用与已删除函数相当的原型函数。
例如:
Array.concat(<array1>, <array2>)是一个静态函数,不再在MongoDB 6.0中工作。<array1>.concat(<array2>)是一个原型函数,仍然在MongoDB 6.0中工作。此行为既适用于已删除的数组,也适用于已删除的字符串函数。
删除了数组函数
从MongoDB 6.0开始,以下数组函数将被删除,不能在服务器端JavaScript中使用$accumulator、$function和$where表达式:
Array.concatArray.everyArray.filterArray.forEachArray.indexOfArray.joinArray.lastIndexOfArray.mapArray.popArray.pushArray.reduceArray.reduceRightArray.reverseArray.shiftArray.sliceArray.someArray.sortArray.spliceArray.unshift
删除了字符串函数
从MongoDB 6.0开始,以下数组函数将被删除,不能在服务器端JavaScript中使用$accumulator、$function和$where表达式:
String.charAtString.charCodeAtString.concatString.containsString.endsWithString.includesString.indexOfString.lastIndexOfString.localeCompareString.matchString.normalizeString.replaceString.searchString.sliceString.splitString.startsWithString.substrString.substringString.toLocaleLowerCaseString.toLocaleUpperCaseString.toLowerCaseString.toUpperCaseString.trimString.trimLeftString.trimRight
默认db.stats()设置
从MongoDB 6.0开始,dbStats命令和db.stats()方法仅在freeStorage参数设置为1时报告分配给集合的可用空间。
索引过滤器和整理
从MongoDB 6.0开始,索引过滤器使用之前使用planCacheSetFilter命令设置的排序。
集合和视图中的数组具有distinct命令
从MongoDB 6.0开始,distinct命令在使用数组时返回相同的集合和视图结果。
请参阅集合和视图中的数组。
降级注意事项
以下部分提供了从部署中删除向后不兼容功能的信息。如果您要从MongoDB 6.0降级到更早的版本,请查看以下部分,以确保您的部署在降级后成功运行。
集群集合
从MongoDB 5.3开始,如果您使用的是集群集合,则必须先删除这些集合,然后才能降级到更早的MongoDB版本。
用户写入阻止
从MongoDB 6.0开始,如果您需要降级功能兼容性版本,请确保禁用集群到集群复制和用户写入阻止。
时间序列集合
在降级之前,您必须删除时间序列集合:
- MongoDB 6.0或更高版本到MongoDB 5.0.7或更早版本。
- MongoDB 5.3到MongoDB 5.0.5或更早版本。
请参阅时间序列集合。
集群参数
从MongoDB 6.0开始,确保所有setClusterParameter操作都已完成。如果在分片集群上有任何正在进行的setClusterParameter操作,则无法成功降级FCV。
SELinux政策数据
从MongoDB 5.1开始,您必须从之前克隆SELinux策略的目录运行以下命令,然后才能降级到更早的MongoDB版本:
sudo make uninstall
密钥管理互操作性协议(KMIP)设置
从MongoDB 5.3 Enterprise开始,如果您使用的是以下KMIP设置,则必须从配置文件中删除它们,然后才能降级到更早的MongoDB版本:
基于时间的更改流图像前和图像后集合
从MongoDB 6.0开始,如果您使用changeStreamOptions.preAndPostImages.expireAfterSeconds来控制图像前和图像后集合的更改流的基于时间保留,则必须确保降级时没有活动setClusterParameter操作。
审核日志加密设置
从MongoDB 6.0 Enterprise开始,如果您正在使用审计日志加密,则必须从配置文件中删除以下设置,然后才能降级到更早的MongoDB版本:
现有的加密审计日志保持加密,您可以保留您为存储和处理加密日志而开发的任何程序。
请参阅使用KMIP服务器管理加密MongoDB审计日志的密钥。
使用图像前后文档更改流
从MongoDB 6.0开始,如果您使用文档前后图像进行更改流,则必须使用collMod命令禁用每个集合的changeStreamPreAndPostImages,然后才能降级到更早的MongoDB版本。
通过扩展事件更改流
如果您的应用程序使用更改流,请确保它不需要showExpandedEvents选项,该选项在降级后将不可用。
带有srv的LDAP:和srv_raw:
如果您的集群配置在其LDAP配置中使用新的"srv:"或"srv_raw:"URL类型,则降级后将无法重新启动。在进行降级之前或降级之前,从集群的配置中删除新的URL类型。
带有加密字段的集合
在完成FCV降级之前,您必须删除使用加密字段的集合。如果有使用encryptedFields的集合,降级将无法完成。