Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

MongoDB 6.0 中的兼容性更改

在此页面上

  • 聚合(Aggregation)
  • Change Streams
  • 索引
  • 旧版 mongo Shell 已删除
  • 平台支持
  • 正则表达式
  • 删除的操作符
  • 已删除选项
  • 删除的参数
  • 重命名后的参数
  • 设置为 expireAfterSeconds 时的 TTL expireAfterSeconds 行为
  • 副本集
  • 安全性
  • 时间序列集合
  • 一般性变更
  • 降级考虑因素

本页介绍 MongoDB 6.0 中引入的更改,而它们可能会影响与旧版本 MongoDB 的兼容性。

MongoDB 6.0 是一个主要版本,这意味着 MongoDB Atlas 和本地部署均支持该版本。MongoDB 6.0 包括 MongoDB 5.1、5.2 和 5.3 快速发布中引入的更改。本页介绍了这些快速发布和 MongoDB 6.0 中引入的兼容性更改。

要详细学习;了解主要版本和快速版本之间的差异,请参阅 MongoDB版本控制。

从 MongoDB 6.0 开始,需要 100 兆字节以上内存容量的管道阶段默认将临时文件写入磁盘。这些临时文件在管道执行期间持续存在,并且可能影响实例上的存储空间。在 MongoDB 的早期版本中,您必须将 { allowDiskUse: true } 传递给单个 findaggregate 命令才能启用此行为。

单个 findaggregate 命令可以通过以下任一方式覆盖 allowDiskUseByDefault 参数:

  • 使用 { allowDiskUse: true } 以允许在 allowDiskUseByDefault 设置为 false 时将临时文件写入磁盘

  • 使用 { allowDiskUse: false } 以禁止在 allowDiskUseByDefault 设置为 true 时将临时文件写入磁盘

从 MongoDB 6.0开始,Atlas Search $$SEARCH_META聚合变量可在任何管道中 $search阶段之后的任何位置使用,但不能在任何管道中$lookup$unionWith阶段之后使用。 $$SEARCH_META聚合变量不能在$searchMeta阶段之后的任何后续阶段中使用。

从 MongoDB 5.3 开始,在范围迁移期间,不会为孤立文档的更新生成 change stream 事件。

从 MongoDB 6.0 开始,只要有可能,匹配筛选器就会比之前的版本更早地应用到变更流。这样可以提高性能。对于定义狭窄的筛选器,较早的匹配可能会导致先前版本中成功的操作在 6.0 中失败。

从 MongoDB 6.0 开始,将 "*" 传递给 dropIndexesdb.collection.dropIndexes() 会删除 _id 索引和最后剩余的分片键索引(如果有)之外的所有索引。尝试显式删除最后一个剩余分片键索引会引发错误。

从 MongoDB 5.2 开始,即使正在构建索引,也可使用 dropIndexesdb.collection.dropIndexes() 删除针对同一集合的现有索引。在早期版本中,尝试在进行中的索引构建期间删除其他索引会导致 BackgroundOperationInProgressForNamespace 错误。

为防止出现内存不足错误,indexMaxNumGeneratedKeysPerDocument 限制了为单个文档生成的 2dsphere 索引键的最大数量。

请参阅 indexMaxNumGeneratedKeysPerDocument

从 MongoDB 6.0 开始,唯一索引键格式发生了变化。如果你在 MongoDB 6.0 中创建唯一索引,则该索引不适用于 5.3.2 或 5.0.7 之前的 MongoDB 版本。

mongo Shell 已从 MongoDB 6.0 中删除。替代它的是mongosh

从 MongoDB 5.1.2 开始不再支持以下平台:

  • RHEL-72-s390x

从 MongoDB 5.1 开始,不再忽略无效的 $regex options 选项。此更改使 $regex optionsaggregate 命令和投影查询所使用的 $regex 更加一致。

从 MongoDB 5.1 开始,如果某个集合的模式验证规则包含无效的 $regex options,则服务器会:

  • 禁止所有插入和更新操作,直到使用 collMod 命令修改包含无效正则表达式模式的模式验证规则。

  • 将警告错误写入 mongod 日志文件。

从 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 开始,以下参数已重命名:

TTL expireAfterSeconds 设为 NaN 会经历从 MongoDB 4.4 到 MongoDB 6.0 的行为变化,而这会影响 MongoDB 4.4 及更早版本中的初始同步,以及 MongoDB 4.4 及更早版本中的 mongorestore。执行任意上述操作均会导致值为 NaNexpireAfterSeconds 被视为值为 0expireAfterSeconds。因此,文档可能会立即过期。

从 MongoDB 5.1 开始,在启动、重新启动或添加含 sh.addShard()分片服务器时,必须设置集群范围的写关注 (CWWC)

如果未设置 CWWC,并且将分片配置成默认写关注{ w : 1 },将无法启动或添加分片服务器并返回错误。

请参阅默认写关注计算,详细了解如何计算默认写关注。

从 MongoDB 5.1 开始,在发出任何否则会更改新副本集成员的默认写关注reconfigs 之前,您必须设置集群范围的写关注 (CWWC)

从 MongoDB 5.3 开始,SCRAM-SHA-1不能用于集群内身份验证。仅支持 SCRAM-SHA-256

在先前的 MongoDB 版本中,SCRAM-SHA-1 和 SCRAM-SHA-256 均可用于集群内身份验证,即使未显式启用 SCRAM。

从 MongoDB 5.1 开始,在 FIPS 模式下运行的实例默认禁用 SCRAM-SHA-1 身份验证机制。您可以使用 setParameter.authenticationMechanisms 命令启用 SCRAM-SHA-1 身份验证机制

此更改不会影响针对 MongoDB setFeatureCompatibilityVersion 4.0+ 的驱动程序。

从 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

从 MongoDB 5.1 (和 5.0.4 )开始,如果 divisorremainder 值的计算结果为特定值,那么 $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'

自 MongoDB 3.6 起,MongoDB 驱动程序开始使用 OP_MSG,而非 OP_QUERY 及其他旧版操作码和命令。

从 MongoDB 6.0 开始:

注意

OP_QUERY RPC 命令

OP_QUERY RPC 协议可与下列命令一起使用:

  • _isSelf

  • authenticate

  • buildinfo

  • buildInfo

  • hello

  • ismaster

  • isMaster

  • saslContinue

  • saslStart

如果作为 OP_QUERY 发出,所有其他命令均会被拒绝。

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

从 MongoDB 6.0 开始,当 freeStorage 参数设置为 1 时,dbStats 命令和 db.stats() 方法仅报告分配给集合的可用空间。

从 MongoDB 6.0 开始,索引筛选器会使用之前使用 planCacheSetFilter 命令设置的排序规则

从 MongoDB 8.0开始,使用查询设置而不是添加索引筛选器。 从 MongoDB 8.0开始,索引筛选器已弃用。

查询设置的功能比索引筛选器更多。 此外,索引筛选器不是持久性的,您无法轻松地为所有集群节点创建索引筛选器。 要添加查询设置并探索示例,请参阅setQuerySettings

从 MongoDB 6.0 开始,使用数组时,distinct 命令会为集合和视图返回相同的结果。

请参阅集合和视图中的数组。

以下部分提供了有关从部署中删除向后不兼容的功能的信息。如果您从 MongoDB 6.0 降级至较早的版本,请查看以下部分以确保您的部署在降级后能成功运行。

从 MongoDB 5.3 开始,如果使用集群化集合,则必须先删除这些集合,然后才能降级到较早的 MongoDB 版本。

从 MongoDB 6.0 开始,如果需要降级特征兼容性版本,请确保禁用集群到集群复制和用户写入阻止。

请参阅 Cluster-to-Cluster Sync 和用户写入阻塞

必须在降级之前删除时间序列集合:

  • MongoDB 6.0 或更高版本到 MongoDB 5.0.7 或更早版本。

  • MongoDB 5.3 到 MongoDB 5.0.5 或更早版本。

请参阅时间序列集合

从 MongoDB 6.0 开始,请确保所有 setClusterParameter 操作均已完成。如果存在针对分片群集的进行中的 setClusterParameter 操作,则无法成功完成 fCV 降级。

从 MongoDB 5.1 开始,您必须在先前克隆 SELinux 策略的 目录运行以下命令,然后才能 降级到 MongoDB 的早期版本:

sudo make uninstall

从 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 版本。

如果您的应用程序使用了变更流,请确保它不需要 showExpandedEvents 选项,因为该选项在降级后不可用。

如果集群的配置在其 LDAP 配置中使用新的"srv:""srv_raw:" URL 类型,则它将无法在降级后重新启动。 降级之前,请从集群配置中删除新的 URL 类型。

您必须先删除使用加密字段的集合,然后才能完成 fCV 降级。如果存在使用 encryptedFields 的集合,降级则无法完成。

如果您的应用程序使用$densify创建文档来填充空白、添加缺失值或使用指定的值范围填充数据,请在降级之前从聚合管道中删除$densify阶段。 $densify阶段仅在版本5.1及更高版本中可用。

后退

6.0