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 }传递给单个findaggregate命令才能启用此行为。

单个find和aggregate命令可能会通过以下任一方式覆盖allowDiskUseByDefault参数:

  • allowDiskUseByDefault设置为false
  • allowDiskUseByDefault设置为true

更改流

从MongoDB 5.3开始,在范围迁移期间,不会生成更改流事件以更新孤儿文档

索引

最后一个剩余的碎片密钥索引不能无意中删除

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

现有索引可以在索引构建期间删除

从MongoDB 5.2开始,您可以使用dropIndexesdb.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模式验证规则,则服务器:

  • 在使用collMod命令修改包含无效正则表达式模式的模式验证规则之前,阻止所有插入和更新操作。
  • 将警告错误写入mongod日志文件。

删除了操作员

从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)开始,如果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'

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-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的集合,降级将无法完成。

原文:Compatibility Changes in MongoDB 6.0

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""