本文介绍MongoDB 4.0版本的兼容性变化。
如需查看MongoDB官网兼容性更新说明文档,请前往MongoDB官网下载。
移除对MONGODB-CR的支持
从4.0版本开始,MongoDB将不再支持已弃用的MongoDB身份验证机制(MONGODB-CR)。
自3.0版本起,MongoDB不支持创建MONGODB-CR用户,除非部署是从2.6或更早版本升级而来,且原有MONGODB-CR用户未升级认证模式。
若您的部署仍使用MONGODB-CR模式存储用户凭证,在升级到4.0前必须升级至SCRAM(Salted Challenge Response Authentication Mechanism)。
移除authSchemaUpgrade命令
MongoDB 4.0移除了authSchemaUpgrade
命令。该命令在3.0至3.6版本中用于将MONGODB-CR用户升级为SCRAM用户
从 db.copyDatabase() 和 copydb 中移除 MONGODB-CR 支持
db.copyDatabase()
方法无法从强制使用MONGODB-CR认证的mongod实例复制数据。
copydb
命令同样受限。此变更后,MongoDB 4.0移除了copydbgetnonce
命令。
弃用MMAPv1
自4.0版本起,MongoDB弃用MMAPv1存储引擎。若需迁移至WiredTiger存储引擎。
x.509 认证证书限制
从4.0版本开始,若在使用x.509认证时指定--sslAllowInvalidCertificates
或net.ssl.allowInvalidCertificates: true
(MongoDB 4.2起别名改为--tlsAllowInvalidateCertificates
或net.tls.allowInvalidCertificates: true
),无效证书仅能建立TLS/SSL连接,不足以完成认证。
您可以更新为有效证书(如通过可信CA签名),或使用net.ssl.CAFile
指定自定义CA来解决问题。
副本集
移除副本集协议版本 pv0
4.0版本移除了已弃用的副本集协议版本0(pv0)。升级前需先升级至pv1,升级操作示例如下:
cfg = rs.conf();
cfg.protocolVersion=1;
rs.reconfig(cfg);
建议同时调高settings.catchUpTimeoutMillis
以减少在w:1
的writeConcern配置下发生回滚的概率。
移除主从复制
4.0版本不再支持主从复制。若仍在使用此模式,必须转换为副本集。
日志与副本集
4.0版本起,使用WiredTiger存储引擎的副本集成员不可禁用日志(即禁用--nojournal
或storage.journal.enabled: false
)。
索引构建和副本集
在使用--replSet
或replication.replSetName
配置副本集时,您不能指定--noIndexBuildRetry
或storage.indexBuildRetry
参数。也就是说,对于作为副本集成员的mongod
实例,无法使用--noIndexBuildRetry
或storage.indexBuildRetry
。
回滚限制
4.0版本取消回滚数据量上限(原限制为300MB),并引入可配置参数rollbackTimeLimitSecs
(默认1天,4.0之前的版本固定为30分钟)。
分片集群
mongos
在以下影响分片集群元数据的操作中使用"majority"
Write Concern。
命令 | 方法 | 说明 |
|
| |
|
| |
|
| |
|
| 在MongoDB 3.6中更改。 |
|
| |
| ||
|
| |
|
| |
| ||
|
4.0功能兼容性
4.0版本中的一些功能不仅需要4.0的二进制文件,还需要将featureCompatibilityVersion
设置为4.0
。这些功能包括:
SCRAM-SHA-256
新的类型转换运算符(如
$toBool
、$toInt
等)和增强功能多文档事务
$dateToString
选项更改新的变更流方法
更改流恢复令牌数据类型更改
其他变更
分片集群现支持地理空间查询运算符
$near
和$nearSphere
。对于
create
命令以及mongo shell的db.createCollection()
方法,在local
数据库以外的数据库中创建集合时,不能将选项autoIndexId
设置为false
。启用身份验证后,在没有
listDatabases
操作权限的情况下运行listDatabases
命令,系统将返回运行该命令的用户具有find
操作权限的所有数据库的列表。在之前的版本中,在没有listDatabases
操作权限的情况下运行命令会返回Unauthorized
。将
taskExecutorPoolSize
的默认值从0
更改为1
。在Linux上,若要还原4.0部署的先前行为,请将taskExecutorPoolSize
设置为0
,将AsyncRequestsSenderUseBaton
设置为false
。MongoDB 4.0删除了将mongod和mongos实例的
transportLayer
以及net.transportLayer
设置为legacy
的功能。transportLayer
设置默认为asio
,且无法修改。从MongoDB 4.0开始,
reIndex
命令及其db.collection.reIndex()
将采用全局独占锁,并将阻止其他操作,直到完成。如果为
year
、isoYear
和timezone
以外的字段指定的值超出有效范围,则$dateFromParts
将从其他日期部分中减去差值以计算日期。在以前的版本中,超出范围的值会导致错误。修改了
killCursors
权限操作的行为。在MongoDB 4.0之前,如果用户知道进程的ID,他们可以杀死任何进程。从MongoDB 4.0起,killCursors
允许用户杀死与当前身份验证的用户关联的任何进程。如果用户没有终止进程的权限,killCursors
将返回错误。MongoDB 4.0添加了一个
killAnyCursor
权限操作,该操作授予用户终止指定集合的任何游标的权限。从MongoDB 4.0版本开始,当mongos可执行文件尝试连接到功能兼容性版本(fCV)高于自身版本的mongod实例时,该mongos进程将会崩溃。例如,MongoDB 4.0版本的mongos无法连接到将fCV设置为
4.2
的4.2分片集群。不过,若该4.2分片集群的fCV仍保持在4.0
,则MongoDB 4.0版本的mongos可以正常连接。从4.0版本开始,MongoDB按配置解析
localhost
IP地址,而不是假设为127.0.0.1
。
cursor.min()和cursor.max()
如果您使用max()
和min()
来指定范围,则max()
指定的边界必须大于min()
指定的边界。
在之前的版本中,边界可以相等,但不会扫描索引条目,将返回一个空的结果集。
禁用TLS 1.0
MongoDB 二进制文件(mongod、mongos 和 mongo)在支持TLS 1.1+ 的系统上会默认禁用TLS 1.0加密支持。
若需强制启用TLS 1.0支持:
mongod 实例:在配置文件中设置
net.ssl.disabledProtocols: none
,或通过命令行参数--sslDisabledProtocols none
实现。mongos 实例:配置方式与 mongod 相同,使用
net.ssl.disabledProtocols: none
或--sslDisabledProtocols none
。mongo Shell:需添加
--sslDisabledProtocols none
参数。--sslDisabledProtocols
参数可以在以下mongo Shell版本中使用:MongoDB 4.0+
MongoDB 3.6.5+
MongoDB 3.4.15+
macOS 系统中,若使用 3.6.4 或更早版本的 mongo Shell 连接 MongoDB 4.0+ 集群,必须显式启用 TLS 1.0。
mongo Shell
show collections
在mongo Shell中,show collections
等同于:
db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
对于具备权限的用户:显示数据库内所有非系统集合的列表。
对于无权限的用户:仅显示其拥有访问权限的集合。
若4.0版本的mongo Shell连接到4.0之前版本且不支持 authorizedCollections
和 nameOnly
参数的MongoDB时:
用户必须拥有
listCollection
权限才能执行命令。无权限用户执行时,MongoDB 通过
connectionStatus
返回的authenticatedUserPrivileges
字段生成近似结果。
db.getCollectionNames()
在mongo Shell中,db.getCollectionNames()
等同于:
db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
对于具有访问权限的用户,该方法会列出数据库中所有集合的命令。
对于不具有访问权限的用户,该方法仅会列出执行该命令的用户拥有权限的集合。
删除了二进制和已弃用的字段/命令
mongoperf
MongoDB 4.0删除了mongoperf二进制文件。
copydb和clone命令
MongoDB 4.0不再支持copydb
和clone
命令,以及mongo Shell的帮助函数db.copyDatabase()
和db.cloneDatabase()
。
作为替代方案,您可以使用mongodump和mongorestore(需配合mongorestore选项的--nsFrom
和--nsTo
参数使用)或使用驱动程序编写脚本。
例如,将test
数据库复制到同实例的 examples
数据库,您可以:
用于
mongodump
将test
数据库转储到归档文件mongodump-test-db
。mongodump --archive="mongodump-test-db" --db=test
使用
mongorestore
搭配--nsFrom
和--nsTo
参数从存档中恢复。mongorestore --archive="mongodump-test-db" --nsFrom='test.*' --nsTo='examples.*'
您可以按需添加参数,例如 --uri
、--host
、--username
等。
您也可以不使用存档文件,通过 mongodump
将test
数据库连接到标准输出流,并通过管道传递到mongorestore
。
mongodump --archive --db=test | mongorestore --archive --nsFrom='test.*' --nsTo='examples.*'
参数
删除已弃用的logUserIds
参数。
$isolated运算符
MongoDB不再支持$isolated
运算符。如果您有包含$isolated
运算符的索引或视图,请在升级之前重新创建没有该运算符的索引或视图。
geoNear命令
MongoDB弃用了geoNear
命令,请改用以下命令:
$geoNear
聚合阶段$near
查询操作符$nearSphere
查询操作符
maxScan选项
MongoDB弃用了maxScan
和mongo Shell的cursor.maxScan()
,请改用maxTimeMS
或mongo Shell的cursor.maxTimeMS()
。
输出字段变更
replSetGetStatus
返回结果中的以下字段已弃用:replSetGetStatus.syncingTo
replSetGetStatus.members[n].syncingTo
请改用
replSetGetStatus.replSetGetStatus.syncSourceHost
和replSetGetStatus.members[n].syncSourceHost
。$currentOp
聚合阶段、currentOp
命令以及db.currentOp()
帮助函数在其输出结果中将不再返回threadId
字段。serverStatus
的asserts.warning
字段固定返回0
。