MongoDB 5.0中的兼容性变化
以下5.0更改可能会影响与旧版本MongoDB的兼容性。
某些命令只接受可识别的参数
从MongoDB 5.0开始,如果传递了命令不显式接受的参数,某些数据库命令会引发错误。在MongoDB 4.4及更早版本中,无法识别的参数被默默忽略。
受影响的命令:
abortTransactionaggregateauthenticatecollModcommitTransactioncreatecreateIndexesdeletedropdropDatabasedropIndexesendSessionsexplainfindfindAndModifygetMorehelloinsertkillCursorslistCollectionslistDatabaseslistIndexespingrefreshSessionsupdate
移除了命
从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 percentageunderwiredTigerwiredTiger.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修改无法更新以使用主机名的节点。该参数仅适用于配置命令。
mongodmongos不依赖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
reIndexcommand 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_REPLYOP_UPDATEOP_INSERTOP_QUERYOP_GET_MOREOP_DELETEOP_KILL_CURSORS
较新的驱动程序版本使用OP_MSG,而不是这些不建议使用的操作码。
MongoDB 5.0也不建议使用相关命令和方法:
getLastErrordb.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+。