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
。
移除了传统的mongo
shell
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协议可用于以下命令:
_isSelf
authenticate
buildinfo
buildInfo
hello
ismaster
isMaster
saslContinue
saslStart
删除了服务器端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.concat
Array.every
Array.filter
Array.forEach
Array.indexOf
Array.join
Array.lastIndexOf
Array.map
Array.pop
Array.push
Array.reduce
Array.reduceRight
Array.reverse
Array.shift
Array.slice
Array.some
Array.sort
Array.splice
Array.unshift
删除了字符串函数
从MongoDB 6.0开始,以下数组函数将被删除,不能在服务器端JavaScript中使用$accumulator
、$function
和$where
表达式:
String.charAt
String.charCodeAt
String.concat
String.contains
String.endsWith
String.includes
String.indexOf
String.lastIndexOf
String.localeCompare
String.match
String.normalize
String.replace
String.search
String.slice
String.split
String.startsWith
String.substr
String.substring
String.toLocaleLowerCase
String.toLocaleUpperCase
String.toLowerCase
String.toUpperCase
String.trim
String.trimLeft
String.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
的集合,降级将无法完成。