MongoDB 5.0中的兼容性变化
以下5.0更改可能会影响与旧版本MongoDB的兼容性。
某些命令只接受可识别的参数
从MongoDB 5.0开始,如果传递了命令不显式接受的参数,某些数据库命令会引发错误。在MongoDB 4.4及更早版本中,无法识别的参数被默默忽略。
受影响的命令:
abortTransaction
aggregate
authenticate
collMod
commitTransaction
create
createIndexes
delete
drop
dropDatabase
dropIndexes
endSessions
explain
find
findAndModify
getMore
hello
insert
killCursors
listCollections
listDatabases
listIndexes
ping
refreshSessions
update
移除了命
从MongoDB 5.0开始,删除了以下数据库命令和mongo shell helper方法:
删除了命令 | 替代品 |
---|---|
db.collection.copyTo() |
$out |
db.collection.ensureIndex() |
db.collection.createIndex() |
db.collection.save() |
db.collection.insertOne() db.collection.insertMany() |
db.resetError() |
无法使用 |
geoSearch |
其中之一 Geospatial Query Operators |
Mongo.getSecondaryOk() |
Mongo.getReadPrefMode() |
Mongo.isCausalConsistency |
无法使用 |
Mongo.setSecondaryOk() |
Mongo.setReadPref() |
rs.secondaryOk() |
Mongo.setReadPref() |
resetError |
无法使用 |
shardConnPoolStats |
connPoolStats |
unsetSharding |
无法使用 |
移除了参数
MongoDB 5.0删除了以下服务器参数:
移除了参数 | 描述 |
---|---|
cachePressureThreshold |
MongoDB 5.0删除了cachePressureThreshold 服务器参数。由于WiredTiger计算快照窗口大小的方式发生了变化,此参数不再相关。 |
shouldMultiDocTxnCreateCollectionAndIndexes |
MongoDB 5.0删除了shouldMultiDocTxnCreateCollectionAndIndexes 服务器参数。在5.0+中,事务内部的集合和索引创建始终处于启用状态。您不能再使用服务器参数禁用此行为。 |
已移除索引类型
MongoDB 5.0删除了不建议使用的geoHaystack索引。改为使用2d索引。
将MongoDB实例升级到5.0并设置featureCompatibilityVersion到5.0
将删除任何先前存在的geoHaystack索引。
移除了指标
从MongoDB 5.0开始,serverStatus
命令没有输出opReadConcernCounters
,其中包含读取查询操作指定的关注级别。相反,新的readConcernCounters
替换opReadConcernCounters
并包含其他信息。
从MongoDB 5.0开始,serverStatus
命令不会输出cache pressure percentage threshold
和current cache pressure percentage
underwiredTigerwiredTiger.snapshot-window-settings
。
currentOp
输出变化
从MongoDB 5.0开始,$currentOp.remainingOperationTimeEstimated
指标仅存在于收件人碎片,当分片操作正在进行中。
TTL expireAfterSeconds设置为NaN时的行为
从MongoDB 5.0开始,TTL索引expireAfterSeconds
设置为NaN
与早期版本相比,行为发生了变化。
行为变化会影响:
- 直接升级
- 从早期版本开始的初始同步
mongorestore
来自早期版本
执行上述任何操作都会导致expireAfterSeconds
价值NaN
被视为expireAfterSeconds
的0
。因此,文件可能会立即过期。
从MongoDB 5.0.14(和6.0.2)开始,服务器将不会使用具有expireAfterSeconds
设置为NaN
。
shell变化
Mongo shell在MongoDB v5.0中已被弃用。替换的shell是mongosh
。
MongoDB v5.0中的外sell也发生了变化。请参考安装说明了解更多详情。
复本集
enableMajorityReadConcern
无法配置
从MongoDB 5.0开始,enableMajorityReadConcern
和--enableMajorityReadConcern
由于存储引擎的改进,无法更改,并且始终设置为true
。
在早期版本的MongoDB中,enableMajorityReadConcern
和--enableMajorityReadConcern
是可配置的,可以设置为false
防止存储缓存压力使用三元一级-二级仲裁器(PSA)架构固定部署。
如果您使用的是三人初级-中学仲裁员(PSA)架构,请考虑以下几点:
- 书面关注
"majority"
如果辅助功能不可用或滞后,可能会导致性能问题。有关如何缓解这些问题的建议,请参阅缓解PSA副本集的性能问题。 - 如果您使用的是全局默认值
"majority"
写入问题小于大多数的大小,您的查询可能会返回陈旧(未完全复制)的数据。
secondaryDelaySecs
配置设置
从MongoDB 5.0开始,secondaryDelaySecs
替换s slaveDelay
。此更改不向后兼容。s
Split Horizon DNS需要主机名
配置集群节点拆分地平线DNS,使用主机名而不是IP地址。
从MongoDB v5.0开始,replSetInitiate
和replSetReconfig
拒绝使用IP地址而不是主机名的配置。
使用disableSplitHorizonIPCheck
修改无法更新以使用主机名的节点。该参数仅适用于配置命令。
mongod
mongos
不依赖disableSplitHorizonIPCheck
启动时进行验证。遗产mongod
和mongos
使用IP地址而不是主机名的实例将在升级后启动。
配置了IP地址的实例会记录使用主机名而不是IP地址的警告。
非事务性读取配置事务
从MongoDB 5.0开始,不允许在config.transactions
包含以下阅读问题和选项的集合:
"snapshot"
"majority"
并设置了 afterClusterTime 选项- 使用MongoDB驱动程序和
"majority"
在a内因果一致的会话
手动操作日志写入
从MongoDB 5.0开始,不再可能对在作为副本集运行的集群上进行oplog。作为独立实例运行时,对oplog执行写操作只能在MongoDB支持的指导下完成。
新投票副本集成员的自动重新配置
从MongoDB 5.0开始,新添加的中学不算作有表决权的成员,在达到SECONDARY
状态。
当新的投票节点添加到副本集时,replSetReconfig
将在内部向节点的配置添加一个newlyAdded字段。具有newlyAdded字段的节点不计入当前投票节点数。当初始同步完成并且节点达到 SECONDARY
状态时,将自动删除newlyAdded字段。
笔记:
- 尝试添加名为
newlyAdded
即使使用{ force: true }
。- 如果现有节点具有
newlyAdded
字段,使用rs.reconfig()
更改配置不会删除newlyAdded
田野。这个newlyAdded
字段将附加到用户提供的配置中。replSetGetConfig
将从其输出中删除任何newlyAdded
字段。如果你想看任何newlyAdded
字段,您可以直接查询local.system.replset
集合。
删除了 getLastErrorDefaults 的可自定义值
从MongoDB 5.0开始,除了默认值外,您无法使用settings.getLastErrorDefaults
指定默认写入问题{ w: 1, wtimeout: 0 }
。相反,请使用setDefaultRWConcern
命令为副本集或分片集群设置默认读写关注配置
阅读Capped Collections上的关注snapshot
从MongoDB 5.0开始,当从封顶集合阅读时,不能使用读取关注点“snapshot”。
local
是默认读取问题
从MongoDB 5.0开始,"local"
是针对主要和次要读取操作的默认读取关注级别。
这可能会为使用过滤器的计数查询带来显著的延迟增加,并且涵盖的查询。
您可以通过设置集群范围来选择退出此行为阅读关注setDefaultRWConcern
。
最新cursor.map()
退货类型
cursor.map()
在遗留mongo shell中返回了一个数组。返回类型是mongosh
中的Cursor。可以使用.toArray()转换结果。
更新操作符更改
从MongoDB 5.0开始,当您使用以下具有空操作数表达式({ }
的更新运算符时,mongod
不再引发错误:
$addToSet
$bit
$currentDate
$inc
$max
$min
$mul
$pop
$pull
$pullAll
$push
$rename
$set
$setOnInsert
$unset
空更新不会导致任何更改,也不会创建oplog条目(这意味着该操作是no-op)。
更新操作员处理订单
从MongoDB 5.0开始,更新运算符按照词典顺序处理带有基于字符串的名称的文档字段。带有数字名称的字段按数字顺序处理。有关详细信息,请参阅更新运算符行为。
$setWindowFields
阶段,包含事务和快照读取问题
在5.3之前的MongoDB版本中,$setWindowFields
聚合管道阶段不能与事务或"snapshot"
读取问题一起使用。
聚合管道运算符参数限制
以下聚合管道运算符现在有一个64位整数值最大限制。
如果您传递的值超过此限制,管道将返回无效的参数错误。
listDatabases
产出变化
从MongoDB 5.0开始,针对mongod运行的 listDatabases
命令的输出与针对mongos运行的listDatabases
命令的输出更加一致。
下表显示了MongoDB 5.0和早期版本之间listDatabases
输出字段的数据类型差异。仅列出5.0和更早版本之间不同的字段。
字段 | 在MongoDB 5.0中键入 | 在MongoDB 4.4及更早版本中键入(mongod ) |
在MongoDB 4.4及更早版本中键入(mongos ) |
---|---|---|---|
sizeOnDisk |
整数 | 双倍 | 整数 |
totalSize |
整数 | 双倍 | 整数 |
totalSizeMb |
整数 | 不存在(见下文) | 整数 |
listDatabases
输出现在包括针对mongos
或mongod
运行时的totalSizeMb
字段。在MongoDB 4.4及更早版本中,totalSizeMb
仅在与mongos
运行时出现。totalSizeMb
是sizeOnDisk
字段的总和,以兆字节表示。
当对着mongos
运行时,listDatabases
输出中的shards
字段包含特定碎片上每个集合的字段值对。shards
字段中的大小值以整数表示。
安全
TLS连接X509证书启动警告
从MongoDB 5.0开始,当mongod
和mongos
证书不包含主题替代名称属性时,它们会发出启动警告。
以下平台不支持通用名称验证:
- iOS 13及更高版本
- MacOS 10.15及更高版本
- 去1.15及更高
使用这些平台的客户端不会对使用主机名由CommonName属性指定的x.509证书的MongoDB服务器进行身份验证。
地图减少
从5.0版本开始,MongoDB不建议使用地图减少操作。
有关映射减少操作的聚合管道替代方案示例,请参阅地图减少到聚合管道和地图减少示例。
审计
MongoDB 5.0增加了可以在运行时配置的审计功能。
如果auditLog.runtimeConfiguration
设置为true
,则mongod
和mongos
配置文件将无法再设置setParameter.auditAuthorizationSuccess
或配置审计过滤器。如果服务器配置文件包含这些设置,服务器将无法启动并记录错误。
如果auditLog.runtimeConfiguration
设置为false
,并且存在审计过滤器配置文档,则将发出启动警告,但服务器不会中止。
降低分片事务中过期数据块的风险
从MongoDB 5.0开始,如果您更改transactionLifetimeLimitSeconds
参数,您还必须将transactionLifetimeLimitSeconds
更改为所有配置服务器副本集成员的相同值。保持此值的一致性:
- 确保路由表历史记录至少保留在碎片副本集成员的事务生命周期限制之内。
- 降低事务重试频率,从而提高性能。
一般变化
从MongoDB 5.0开始:
- 对于设置为
"5.0"
或更高的功能兼容性版本,用户不能再直接写入.system.views
集合。 - The
reIndex
command and thedb.collection.reIndex()
shell method may only be run on standalone instances. - 单个管道中允许的聚合管道阶段数量限制为1000个。
- 当启用
directoryPerDB
或--directoryperdb
时,删除数据库中的最终集合(或删除数据库本身),将删除该数据库的新空子目录。 - 如有必要,
$subtract
聚合运算符将转换结果的数据类型,以准确表示结果值。有关特定转换,请参阅$subtract
。此更改也适用于MongoDB 4.4.3+、4.2.12+、4.0.22+和3.6.22+。 - MongoDB删除了
--serviceExecutor
命令行选项和相应的net.serviceExecutor
配置选项。 - 如果设置了
--apiStrict
选项,则不得在同一客户端会话中同时对多个用户进行身份验证。在设置--apiStrict
选项时,尝试以现有用户身份登录时作为新用户进行身份验证,每次身份验证尝试都会生成一次错误消息。如果您不使用--apiStrict
选项,在当前以现有用户身份登录时作为新用户进行身份验证,每次身份验证尝试都会向日志写一次警告。 - 权重选项仅适用于
$text
索引。 - 在尝试使用将更改隐式默认写入关注的配置重新配置重新配置非分片副本之前,您必须显式设置全局默认写入问题。要设置全局默认写入问题,请使用
setDefaultRWConcern
命令。 - 要设置
replSetOplog
大小mongosh
,使用Double()
构造函数和replSetResizeOplog
命令。
弃用
不建议使用的 | 描述 |
---|---|
mongo |
The legacy mongo shell has been deprecated in MongoDB v5.0. The replacement is mongosh 。 |
db.printSlaveReplicationInfo() |
自4.4.1版本以来不建议使用:改为使用使用db.printSecondaryReplicationInfo() 。 |
rs.printSlaveReplicationInfo() |
自4.4.1版本以来不建议使用:改为Usersrs.printSecondaryReplicationInfo() 。 |
security.clusterIpSourceWhitelist |
在5.0版本中不建议使用:改为使用security.clusterIpSourceAllowlist 。 |
--clusterIpSourceWhitelist |
5.0版本不建议使用:改用--clusterIpSourceAllowlist 。 |
logout |
在5.0版本中不建议使用:断开与服务器的连接以结束会话。 |
db.logout() |
在5.0版本中不建议使用:断开与服务器的连接以结束会话。 |
本地审计消息字段 | 5.0版本不建议使用:改用clientMetadata审计消息中的localEndpoint 字段。 |
不建议使用的电线协议操作码
MongoDB 5.0不建议使用以下有线协议操作码:
OP_REPLY
OP_UPDATE
OP_INSERT
OP_QUERY
OP_GET_MORE
OP_DELETE
OP_KILL_CURSORS
较新的驱动程序版本使用OP_MSG,而不是这些不建议使用的操作码。
MongoDB 5.0也不建议使用相关命令和方法:
getLastError
db.getLastError()
db.getLastErrorObj()
为了确保您的驱动程序使用最新的有线协议,请将驱动程序升级到与5.0兼容的版本。
任何显式使用getLastError
、db.getLastError()
、ordbdb.getLastErrorObj()
的代码都应使用CRUD API来发出所需的写入问题。有关写操作成败的信息将由驱动程序直接作为返回值提供。
5.0 功能兼容性
5.0中的一些功能不仅需要5.0二进制文件,还需要将功能兼容性版本(fCV)设置为5.0。这些功能包括:
- 创建时间序列集合需要将fCV设置为5.0+。
- 配置运行时审计过滤器管理需要将fCV设置为5.0+。
- 在字段名称中使用
.
和$
需要将fCV设置为5.0+。 - 重新分片集合需要将fCV设置为5.0+。