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 中引入的兼容性更改。
要详细学习;了解主要版本和快速版本之间的差异,请参阅 MongoDB版本控制。
聚合(Aggregation)
allowDiskUse
更改
从 MongoDB 6.0 开始,需要 100 兆字节以上内存容量的管道阶段默认将临时文件写入磁盘。这些临时文件在管道执行期间持续存在,并且可能影响实例上的存储空间。在 MongoDB 的早期版本中,您必须将 { allowDiskUse: true }
传递给单个 find
和 aggregate
命令才能启用此行为。
单个 find
和 aggregate
命令可以通过以下任一方式覆盖 allowDiskUseByDefault
参数:
使用
{ allowDiskUse: true }
以允许在allowDiskUseByDefault
设置为false
时将临时文件写入磁盘使用
{ allowDiskUse: false }
以禁止在allowDiskUseByDefault
设置为true
时将临时文件写入磁盘
$$SEARCH_META
限制
从 MongoDB 6.0开始,Atlas Search $$SEARCH_META
聚合变量可在任何管道中 $search
阶段之后的任何位置使用,但不能在任何管道中$lookup
或$unionWith
阶段之后使用。 $$SEARCH_META
聚合变量不能在$searchMeta
阶段之后的任何后续阶段中使用。
Change Streams
从 MongoDB 5.3 开始,在范围迁移期间,不会为孤立文档的更新生成 change stream 事件。
筛选器
从 MongoDB 6.0 开始,只要有可能,匹配筛选器就会比之前的版本更早地应用到变更流。这样可以提高性能。对于定义狭窄的筛选器,较早的匹配可能会导致先前版本中成功的操作在 6.0 中失败。
索引
最后剩余的分片键索引不会被不慎删除
从 MongoDB 6.0 开始,将 "*"
传递给 dropIndexes
或 db.collection.dropIndexes()
会删除除 _id
索引和最后剩余的分片键索引(如果有)之外的所有索引。尝试显式删除最后一个剩余分片键索引会引发错误。
在索引构建过程中可以删除现有索引
从 MongoDB 5.2 开始,即使正在构建索引,也可使用 dropIndexes
或 db.collection.dropIndexes()
删除针对同一集合的现有索引。在早期版本中,尝试在进行中的索引构建期间删除其他索引会导致 BackgroundOperationInProgressForNamespace
错误。
2dsphere 文档索引键
为防止出现内存不足错误,indexMaxNumGeneratedKeysPerDocument
限制了为单个文档生成的 2dsphere 索引键的最大数量。
索引键格式
从 MongoDB 6.0 开始,唯一索引键格式发生了变化。如果你在 MongoDB 6.0 中创建唯一索引,则该索引不适用于 5.3.2 或 5.0.7 之前的 MongoDB 版本。
旧版mongo
Shell 已删除
mongo
Shell 已从 MongoDB 6.0 中删除。替代它的是mongosh
。
平台支持
从 MongoDB 5.1.2 开始不再支持以下平台:
Community Edition
RHEL-72-s390x
正则表达式
$regex
查找查询不再忽略无效的 Regex
从 MongoDB 5.1 开始,不再忽略无效的 $regex options
选项。此更改使 $regex options
与 aggregate
命令和投影查询所使用的 $regex
更加一致。
$regex
模式验证错误行为
从 MongoDB 5.1 开始,如果某个集合的模式验证规则包含无效的 $regex options
,则服务器会:
删除的操作符
从 MongoDB 5.1 开始,删除了以下旧版查询操作符:
删除的操作符 | 替代方案 |
---|---|
$comment | |
$explain | |
$hint | |
$max | |
$maxTimeMS | |
$min | |
$orderby | |
$query | 请参阅《游标方法》 |
returnKey | |
$showDiskLoc | |
db.getLastError() | 请参阅《删除的旧版操作码》 |
db.getLastErrorObj() | 请参阅《删除的旧版操作码》 |
getLastError | 请参阅《删除的旧版操作码》 |
已删除选项
MongoDB 6.0 将删除 --cpu
mongod
选项。
删除的参数
MongoDB 6.0 删除了以下服务器参数:
已删除参数 | 说明 |
---|---|
此选项已从 MongoDB Community Edition 中删除,但在 MongoDB Enterprise Edition 中可用。 MongoDB Community Edition 不支持 FIPS 功能。如果您的安装使用了 FIPS,则需要在升级之前重新配置 TLS/SSL 连接。 |
重命名后的参数
从 MongoDB 6.0 开始,以下参数已重命名:
wiredTigerConcurrentReadTransactions
现在storageEngineConcurrentReadTransactions
wiredTigerConcurrentWriteTransactions
现在storageEngineConcurrentWriteTransactions
设置为 时的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 开始,在启动、重新启动或添加含 sh.addShard()
的分片服务器时,必须设置集群范围的写关注 (CWWC)。
如果未设置 CWWC
,并且将分片配置成默认写关注为 { w : 1 }
,将无法启动或添加分片服务器并返回错误。
请参阅默认写关注计算,详细了解如何计算默认写关注。
rs.reconfig
集群范围的写关注验证
从 MongoDB 5.1 开始,在发出任何否则会更改新副本集成员的默认写关注的 reconfigs
之前,您必须设置集群范围的写关注 (CWWC)。
安全性
集群内身份验证
从 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+ 的驱动程序。
必须启用 OCSP
从 MongoDB 6.0 开始,如果在初始同步期间将 ocspEnabled
设为 true
,则所有节点均须能访问 OCSP 响应器。
如果成员在 STARTUP2
状态下发生故障,则将 tlsOCSPVerifyTimeoutSecs
设置为小于 5
的值。
时间序列集合
警告
如果在 MongoDB 5.1 或更高版本中创建分片时间序列集合,则降级到低于 MongoDB 5.0.4 的版本将导致数据丢失。
在降级到早于 5.0.4 的版本之前,删除所有分片时间序列集合。
时间序列集合上的二级索引
如果在时间序列集合上具有二级索引,并且您需要降级特征兼容性版本 (FCV),必须先删除与降级 FCV 不兼容的任何二级索引。有关详细信息,请参阅 setFeatureCompatibilityVersion
。
一般性变更
弃用
已弃用 | 说明 |
---|---|
MongoDB v6.0 已弃用 db.collection.reIndex() 方法。 | |
MongoDB v6.0 已弃用 reIndex 命令。 | |
简单网络管理协议 (SNMP) | 从 MongoDB 6.0 开始,SNMP 已弃用,并将在下一版本中删除。要监控部署,请使用 MongoDB Ops Manager。 |
$mod
错误行为
从 MongoDB 5.1 (和 5.0.4 )开始,如果 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 开始:
删除了服务器端 JavaScript 中建议弃用的数组和字符串函数
MongoDB 6.0 将用于服务器端 JavaScript、$accumulator
、$function
和 $where
表达式的 JavaScript 引擎从 MozJS-60 升级到 MozJS-91。MozJS-91 已删除 MozJS-60 中存在的若干已弃用的非标准数组和字符串函数。
有关已删除数组和字符串函数的完整列表,请参阅本页的后续部分。
注意
仅删除静态函数
仅删除静态 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 开始,当 freeStorage 参数设置为 1 时,dbStats
命令和 db.stats()
方法仅报告分配给集合的可用空间。
索引筛选器和排序规则
从 MongoDB 6.0 开始,索引筛选器会使用之前使用 planCacheSetFilter
命令设置的排序规则。
从 MongoDB 8.0开始,使用查询设置而不是添加索引筛选器。 从 MongoDB 8.0开始,索引筛选器已弃用。
查询设置的功能比索引筛选器更多。 此外,索引筛选器不是持久性的,您无法轻松地为所有集群节点创建索引筛选器。 要添加查询设置并探索示例,请参阅setQuerySettings
。
使用 命令处理集合和视图中的数组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
Key Management Interoperability Protocol (KMIP) 设置
从MongoDB 6.0开始,默认KMIP协议版本为1.2 。要使用 KMIP 版本1.0或1.1 ,请使用useLegacyProtocol
设置。
从 MongoDB 5.3 Enterprise 开始,如果您使用以下 KMIP 设置,则必须先将其从配置文件中删除,然后才能降级到较早的 MongoDB 版本:
基于时间的变更流前后映像集合的保留
从 MongoDB 6.0 开始,如果使用 changeStreamOptions.preAndPostImages.expireAfterSeconds
来控制基于时间的变更流前后映像集合的保留,则必须确保降级时没有处于活动状态的 setClusterParameter
操作。
审核日志加密设置
从 MongoDB 6.0 Enterprise 开始,如果您使用审核日志加密,则必须从配置文件中删除以下设置,然后才能降级到较早的 MongoDB 版本:
现有加密审核日志将保持加密状态,您可以保留为存储和处理加密日志所开发的任何程序。
请参阅审核日志。
附带文档前映像和后映像的变更流
从 MongoDB 6.0 开始,如果您将文档前图像和后图像用于 change stream,则必须使用 collMod
命令为每个集合禁用 changeStreamPreAndPostImages,然后才能降级到早期 MongoDB 版本。
带扩展事件的 change stream
如果您的应用程序使用了变更流,请确保它不需要 showExpandedEvents
选项,因为该选项在降级后不可用。
附带srv:
和 的LDAPsrv_raw:
如果集群的配置在其 LDAP 配置中使用新的"srv:"
或"srv_raw:"
URL 类型,则它将无法在降级后重新启动。 降级之前,请从集群配置中删除新的 URL 类型。
包含加密字段的集合
您必须先删除使用加密字段的集合,然后才能完成 fCV 降级。如果存在使用 encryptedFields
的集合,降级则无法完成。
创建新文档操作使用 $densify
如果您的应用程序使用$densify
创建文档来填充空白、添加缺失值或使用指定的值范围填充数据,请在降级之前从聚合管道中删除$densify
阶段。 $densify
阶段仅在版本5.1及更高版本中可用。