MongoDB 4.2中的兼容性变化
拆卸MMAPv1存储引擎
MongoDB 4.2取消了对已弃用的MMAPv1存储引擎的支持。
如果您的4.0部署使用MMAPv1,则在升级到MongoDB 4.2之前,您必须将部署更改为WiredTiger存储引擎。有关详细信息,请参阅:
MMAPv1特定配置选项
MongoDB删除了以下MMAPv1特定配置选项:
移除了配置文件设置 | 删除了命令行选项 |
---|---|
storage.mmapv1.journal.commitIntervalMs |
|
storage.mmapv1.journal.debugFlags |
mongod --journalOptions |
storage.mmapv1.nsSize |
mongod --nssize |
storage.mmapv1.preallocDataFiles |
mongod --noprealloc |
storage.mmapv1.quota.enforced |
mongod --quota |
storage.mmapv1.quota.maxFilesPerDB |
mongod --quotaFiles |
storage.mmapv1.smallFiles |
mongod --smallfiles |
storage.repairPath |
mongod --repairpath |
replication.secondaryIndexPrefetch |
mongod --replIndexPrefetch |
笔记:
从4.2版本开始,MongoDB进程将不会从这些选项开始。如果使用WiredTiger部署,请删除任何特定于MMAPv1的配置选项。
MMAPv1特定参数
MongoDB删除了以下MMAPv1参数:
newCollectionsUsePowerOf2Sizes
replIndexPrefetch
MMAPv1特定命令
MongoDB删除了MMAPv1特定的touch
命令。
MMAPv1命令和方法的特定选项
MongoDB删除了MMAPv1特定选项:
noPadding
andusePowerOf2Sizes
forcollMod
verbose
forcollStats
flags
forcreate
paddingFactor
,paddingBytes
,preservePadding
fordb.createCollection()
.
MongoDB忽略了fsync
的MMAPv1特定选项async
。
已移除或已弃用的命令和方法
移除对group
命令的支持
从4.2版开始,MongoDB删除了 group
命令(从3.4版开始就不推荐使用)及其mongo shell助手db.collection.group()
。
将db.collection.aggregate()
与$group
阶段一起使用。
删除对eval
命令的支持
从4.2版本开始,MongoDB删除了eval
命令。自3.0版本以来,eval
命令已被弃用。
关联的MongoDB 4.2 mongo shell
方法db.eval()
和db.collection.copyTo()
只能在连接到MongoDB 4.0或更早版本时运行。
删除对copydb
和clone
命令的支持
从4.2版本开始,MongoDB删除了已弃用的copydb
命令和clone
命令。
对应的mongo shell助手db.copyDatabase()
和db.cloneDatabase()
只能在连接到MongoDB 4. 0或更早版本时运行。
作为替代方案,用户可以使用mongodump
和mongorestore
(带有themorestore选项--nsFrom
和--nsTo
)或使用驱动程序编写脚本。
例如,要将test
数据库从在默认端口27017上运行的本地实例复制到同一实例上的examples
数据库,您可以:
使用
mongodump
转储test
数据库到archivemongodumpmongodump-test-db
:mongodump --archive="mongodump-test-db" --db=test
使用
mongorestore
与--nsFrom
和--nsTo
从存档中恢复(通过数据库名称更改):mongorestore --archive="mongodump-test-db" --nsFrom='test.*' --nsTo='examples.*'
提示:
必要时包括其他选项,例如指定uri或主机、用户名、密码和身份验证数据库。
或者,您可以
mongodump
test
数据库到标准输出流和管道进入mongorestore
:mongodump --archive --db=test | mongorestore --archive --nsFrom='test.*' --nsTo='examples.*'
删除对parallelCollectionScan
命令的支持
从4.2版本开始,MongoDB删除了parallelCollectionScan
。
移除maxScan
MongoDB删除了find命令的过时选项maxScan和mongo shell助手 cursor.maxTimeMS()
。请使用find命令的maxTimeMS选项,或使用帮助器 cursor.maxTimeMS()
。
删除对geoNear
命令的支持
从4.2版本开始,MongoDB删除了geoNear
命令。改用$geoNear
聚合阶段。
$geoNear
的选项类似于已删除的geoNear
命令,但有以下例外:
删除的
geoNear
命令在其输出中包含一个名为dis
的字段,其中包含距离信息。对于
$geoNear
阶段,指定距离字段名称 indistanceField。已删除的
geoNear
命令接受includeLocs
选项的boolean
值,以包含loc
字段。对于
$geoNear
阶段,指定includeLocs
中的位置字段名称。删除的
geoNear
命令包括返回结果的avgDistance
和maxDistance
。您也可以使用聚合管道返回avgDistance和maxDistance。具体而言,在
$geoNear
阶段之后,包括一个$group
阶段以计算avgDistance
和maxDistance
:db.places.aggregate([ { $geoNear: { near: <...>, distanceField: "dis", includeLocs: "loc", spherical: true, ... } }, { $group: { _id: null, objectsLoaded: { $sum: 1 }, maxDistance: { $max: "$dis" }, avgDistance: { $avg: "$dis" } } } ])
另见:
删除对repairDatabase
命令的支持
从4.2版本开始,MongoDB删除了repairDatabase
命令及其mongo shell助手db.repairDatabase()
以及repairDatabase
特权。
作为替代方案:
- 要压缩
mongod
的数据,请使用compact
命令。有关操作的详细信息,请参阅compact
命令。 - 要在独立构建索引,请使用
reIndex
命令或其助手db.collection.reIndex()
。有关操作的详细信息,seereIndex命令和db.collection.reIndex()
参考页面。 - 要为独立服务器恢复数据,请使用
mongod --repair
。有关详细信息,请参阅意外关机后恢复独立状态。
删除对getPrevError
命令的支持
从4.2版本开始,MongoDB删除了过时的getPrevError
命令及其mongo shell助手db.getPrevError()
。
弃用对cloneCollection
的支持
MongoDB不赞成cloneCollection
命令及其mongo shell助手db.cloneCollection()
作为替代方案,
- 用户可以使用
mongoexport
和mongoimport
。 - 用户可以使用聚合管道
$out
或$merge
阶段。 - 使用驱动程序编写脚本。
不建议使用的计划缓存命令/方法
MongoDB不建议使用以下内容:
PlanCache.getPlansByQuery()
方法/planCacheListPlans
命令。要获取形状的缓存查询计划,请使用
$planCacheStats
聚合阶段。有关查询形状,请参阅查找缓存条目详细信息。PlanCache.listQueryShapes()
方法/planCacheListQueryShapes
命令。要列出缓存的查询形状,请使用
$planCacheStats
聚合阶段。请参阅列表查询形状。
集合
$out
阶段限制
$out
和观点
视图定义pipeline
不能包括$out
阶段。如果您已经有一个包含$out
阶段的现有视图,则无法再从此现有视图创建新视图。
对于包含$out
阶段的现有视图,您应该在没有$out
阶段的情况下drop
并recreate
视图,或者使用不包含$out
阶段的新管道replace the view definition
。
$out
和$lookup
$lookup
阶段不能将$out
阶段包含在已加入集合的嵌套管道字段中。
$out
和linearizable
读取关注级别
$out
阶段不能与读取关注"linearizable"
一起使用。
$out
和解释
如果聚合管道包含$out阶段,则不能在executionStats模式或allPlansExecution模式下运行 db.collection.explain()
方法(或 explain
命令)。
如果聚合管道包含$out
阶段,要查看executionStats
或allPlansExecution
信息,请在没有$out
阶段的情况下运行exple解释,以便返回前几个阶段的解释结果。
或者,您可以在queryPlanner
模式下为包含$out
阶段的聚合管道运行解释。
$out
和majority
阅读关注级别
从MongoDB 4.2开始,您可以为包含$out
阶段的聚合指定读取关注级别"majority"
”。
从$geoNear
中移除limit
和num
选项
从4.2版本开始,MongoDB删除了$geoNear
阶段的limit
和num
选项以及100个文档的默认限制。要限制$geoNear
的结果,请使用$geoNear
阶段和$limit
阶段。
例如,以下$geoNear
阶段包含num
选项的聚合在4.2中不再有效。
db.places.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
distanceField: "distance",
num: 5, // Not supported in 4.2
spherical: true
}
}
])
相反,您可以将聚合重写为以下管道:
db.places.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
distanceField: "distance",
spherical: true
}
},
{ $limit: 5 }
])
另见:
Transactions
- 从MongoDB 4.2开始,您无法将
killCursors
指定为事务中的第一个操作。 - 从MongoDB 4.2开始,不能在事务中写入capped集合。事务中仍支持从封顶集合中读取。
- 从MongoDB 4.2开始,MongoDB取消了事务的16MB总大小限制。在4.2版本中,MongoDB创建尽可能多的oplog条目,以封装事务中的所有写入操作。在之前的版本中,MongoDB为事务中的所有写入操作创建一个条目,从而对事务施加了16MB的总大小限制。
更改流
可用性
从MongoDB 4.2开始,无论"majority"
读取关注支持如何,更改流都是可用的;也就是说,读取关注majority
支持可以启用(默认)或禁用以使用更改流。
在MongoDB 4.0及更低版本中,只有当启用"majority"
读取关注支持(默认)时,更改流才可用。
另见:
默认排序
从MongoDB 4.2开始,更改流使用simple
二进制比较,除非提供显式排序。在早期版本中,在单个集合上打开的更改流(db.collection.watch()
)将继承该集合的默认排序。
恢复令牌修改
从MongoDB 4.2开始,如果更改流聚合管道修改事件的_id字段,更改流将抛出异常。
MongoDB Tools
FIP模式
从4.2版本开始,MongoDB删除了以下程序的--sslFIPSMode
选项:
如果 mongod
/ mongos
实例被配置为使用FIPS模式,则程序将使用符合FIPS的连接连接到mongod / mongos。
扩展JSON v2
从4.2版本开始:
二进制 | 变化 |
---|---|
bsondump |
使用扩展JSON v2.0(规范模式)格式。 |
mongodump |
对元数据使用扩展JSON v2.0(规范模式)格式。需要mongorestore 支持扩展JSON v2.0(规范模式或放松模式)格式的4.2或更高版本。提示一般来说,使用相应的版本mongodump 和mongorestore 。也就是说,恢复使用特定版本创建的数据文件mongodump ,使用相应的版本mongorestore 。 |
mongoexport |
默认情况下,在Extended JSON v2.0(放松模式)中创建输出数据。如果与--jsonFormat 一起使用,则在扩展JSON v2.0(规范模式)中创建输出数据。 |
mongoimport |
默认情况下,预计导入数据处于扩展JSON v2.0(放松模式或规范模式)。如果指定了选项--legacy ,可以识别扩展JSON v1.0格式的数据。提示一般来说,版本mongoexport 和mongoimport 应该匹配。也就是说,导入从mongoexport ,您应该使用相应的版本mongoimport 。 |
有关MongoDB扩展JSON v2的详细信息,请参阅MongoDB扩展JSON(v2)。
--query
选项
从4.2版本开始,mongodump --query
和mongoexport --query
的查询选项必须采用扩展JSON v2格式(放松或规范/严格模式),包括将字段名称和运算符包含在引号中,如下所示
mongoexport -d=test -c=records -q='{ "a": { "$gte": 3 }, "date": { "$lt": { "$date": "2016-01-01T00:00:00.000Z" } } }' --out=exportdir/myRecords.json
在早期版本中,查询选项使用扩展JSON v1格式,字段名称和运算符不需要在引号中:
mongoexport -d=test -c=records -q='{ a: { $gte: 3 }, date: { $lt: { "$date": "2016-01-01T00:00:00.000Z" } } }' --out=exportdir/myRecords.json
副本集状态更改
主节点降级
从MongoDB 4.2开始,replSetStepDown
(以及导致降级的replSetReconfig
)不再关闭所有客户端连接。然而,正在进行的写作被杀死了。
在MongoDB 4.0及更低版本中,replSetStepDown
下调期间关闭所有客户端连接
ROLLBACK
状态
从4.2版本开始,当成员进入ROLLBACK
状态时,MongoDB会杀死所有正在进行的用户操作。
4.2 驱动程序默认启用可重试写入
与MongoDB 4.2及更高版本兼容的驱动程序默认启用可重试写入。较早的驱动程序需要retryWrites=true
选项。在使用与MongoDB 4.2及更高版本兼容的驱动程序的应用程序中,可以省略TheretryWritesretryWrites=true
选项。
要禁用可重试写入,使用与MongoDB 4.2及更高版本兼容的驱动程序的应用程序必须在连接环中包含retryWrites=false
。
重要:
local
数据库不支持可重试写入。写入local
数据库的应用程序在升级到4.2系列驱动程序时将遇到写入错误,除非可重试写入被显式禁用。
一般变化
索引
更严格的限制reIndex
MongoDB通过禁止在mongos上运行 reInde
和db.collection.reIndex()
,对针对分片集群中的集合运行reIndex命令和db.collection.reIndex()
shell helper实施了更严格的限制。
对db.collection.dropIndex()
方法的限制
您无法指定db.collection.dropIndex("*")
来删除所有非_id
索引。改用db.collection.dropIndexes()
。
重复索引创建尝试错误消息
如果您使用一个名称创建索引,然后尝试使用另一个名称再次创建索引,MongoDB会更改返回的响应。
从4.2版本开始, createIndexes
命令和mongo shell助手 db.collection.createIndex()
和db.collection.createIndexes()
会报告一个错误,如果你用一个名字创建了一个索引,然后尝试用另一个名字再次创建相同的索引。
{
"ok" : 0,
"errmsg" : "Index with name: x_1 already exists with a different name",
"code" : 85,
"codeName" : "IndexOptionsConflict"
}
在之前的版本中,MongoDB没有再次创建索引,但会返回一个ok
值为1
的响应对象和一个暗示索引没有重新创建的注释。例如:
{
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}
PowerPC上的哈希索引
对于散列索引,MongoDB 4.2确保PowerPC上浮点值2 63的散列值与其他平台一致。在之前的版本中,PowerPC上浮点值2 63的散列值与其他平台不一致。
虽然可能包含大于2 53的浮点值的字段上的散列索引是不受支持的配置,但客户端仍然可以插入索引字段值为2 63的文档。
要列出部署的所有散列索引,请参阅PowerPC和2 63。
如果PowerPC上的当前MongoDB 4.0分片集群包含2 63的散列值作为分片密钥的一部分,则在将分片集群升级到4.2之前必须考虑其他考虑因素。请参阅将分片集群升级到4.2。
min()/max()
从MongoDB 4.2开始,在为adbdb.collection.find()
操作指定min()
/max()
时,您必须使用cursor.hint()
方法显式指定索引forminmin()
/max()
除非find()
查询是_id
字段{ _id: <value> }
上的等式条件。
同样,在find
命令中指定min
/max
时,您还必须显式指定min
/max
索引的hint
。
在之前的版本中,无论查询条件如何,您都可以运行min()
/max()
或命令中相应的min
/max
字段),无论查询条件如何,都可以明确提示索引。如果在4.0及更早版本中没有提示运行,MongoDB将使用indexBounds
中的字段选择索引;但是,如果具有不同排序顺序的相同字段上存在多个索引,则索引的选择可能模棱两可。
CurrentOp
- 在报告
"getmore"
操作时,$currentOp
聚合阶段以及currentOp
命令和db.currentOp()
helper现在将originatingCommand
字段作为新cursor
字段中的嵌套字段返回。在之前的版本中,originatingCommand
是相关"getmore"
文档的顶级字段。另见4.2 currentOp更改。
服务器状态
serverStatus
和db.serverStatus()
方法以64位整数(即NumberLong)而不是32位整数(即NumberInt)的形式返回操作计数器和操作计数器Repl指标。
记录
-
... ACCESS [repl writer worker 5] Unsupported modification to roles collection ...
以前,
syslog
消息文本不包括该组件。例如:... [repl writer worker 1] Unsupported modification to roles collection ...
从MongoDB 4.2开始,
getLog
命令截断任何包含超过1024个字符的事件。在早期版本中,getLog
512个字符后截断。从4.2版本开始,MongoDB记录调试冗高水平。例如,如果冗高水平为2,MongoDB记录
D2
。在之前的版本中,MongoDB日志消息仅为调试级别指定
D
。
Wire Protocol
- MongoDB不再支持已弃用的内部
OP_COMMAND
和相应的OP_COMMANDREPLY
有线协议。
killCursors
变化
Transactions
从MongoDB 4.2开始,您无法将killCursors
指定为事务中的第一个操作。
特权
从MongoDB 4.2开始,用户总是可以杀死自己的光标,无论用户是否有killCursors
的特权。因此,killCursors
特权在MongoDB 4.2+中没有影响。
在MongoDB 3.6.3到MongoDB 4.0.x中,用户需要killCursors
特权,以便在启用访问控制时杀死自己的光标。
移除AsyncRequestsSenderUseBaton
参
在MongoDB 4.2+部署中,MongoDB删除了AsyncRequestsSenderUseBaton
参数,并始终启用由该参数控制的性能增强。
更严格的count
验证语法
从4.2版本开始,MongoDB对count
命令的选项名称进行了更严格的验证。现在,如果您指定未知的选项名称,该命令会出错。
在之前的版本中,MongoDB忽略了无效的选项名称。
因果一致性会议
从MongoDB 4.2开始,ClusterTime之后不再支持以下命令:
移除fastmodinsert
指标
MongoDB 4.2从各种输出中删除了已弃用的fastmodinsert
指标,包括解释excutingStats、分析器输出等。
Map-Reduce
从4.2版本开始,MongoDB不建议:
平衡器状态和自动拆分
从MongoDB 6.1开始,不执行自动分割块。这是因为平衡了政策的改进。自动拆分命令仍然存在,但不执行操作。有关详细信息,请参阅平衡策略更改。
在6.1之前的MongoDB版本中:
balancerStart
命令和mongo shell helper方法sh.startBalancer()
和sh.setBalancerState(true)
也为分片集群启用自动拆分。在启用平衡器时禁用自动拆分,您可以使用
sh.disableAutoSplit()
。balancerStop
命令和mongo shell助手方法sh.stopBalancer()
和sh.setBalancerState(false)
也会禁用分片集群的自动拆分。要在禁用平衡器时启用自动拆分,您可以使用
sh.enableAutoSplit()
。
mongo
方法sh.enableBalancing(namespace)
和sh.disableBalancing(namespace)
对自动分割没有影响。
锁定诊断报告
从4.2版本开始,MongoDB报告ReplicationStateTransition
锁定信息。
此外,MongoDB 4.2将ParallelBatchWriterMode
锁信息与Global
锁信息分开。早期的MongoDB版本报告ParallelBatchWriterMode
锁定信息作为Global
锁的一部分。
有关报告锁定信息的操作,请参阅:
serverStatus
命令和db.serverStatus()
方法。$currentOp
聚合管道阶段、currentOp
命令和db.currentOp()
方法。
findAndModify
查询/排序/投影参数验证
从MongoDB 4.2(以及4.0.12+和3.6.14+)开始,如果指定的查询、排序或投影参数不是文档, findAndModify
命令及其关联的mongo shell方法就会出错。
在早期版本中,该操作将非文档查询或排序参数视为空文档{}
。
参见:
findAndModify
db.collection.findOneAndDelete()
db.collection.findOneAndReplace()
db.collection.findOneAndUpdate()
db.collection.findAndModify()
dropDatabase
和movePrimary
从MongoDB 4.2开始,
- 如果您删除数据库并创建一个同名的新数据库,则:
- 重新启动所有
mongos
实例和mongod
碎片成员;或 - 在读取或写入该数据库之前,对所有
mongos
实例和mongod
碎片成员使用flushRouterConfig
命令。
- 重新启动所有
- 如果使用
movePrimary
命令移动未分片的集合,请执行以下任一操作:- 重新启动所有
mongos
实例和mongod
碎片成员;或 - 在读取或写入该数据库之前,对所有
mongos
实例和mongod
碎片成员使用flushRouterConfig
命令。
- 重新启动所有
这确保了mongos
和shard实例刷新其元数据缓存。否则,您可能会错过读取数据,并且可能不会将数据写入正确的碎片。要恢复,您必须手动干预。
在早期版本中,您只需要在它们实例上重新启动或运行flushRouterConfig
。
有关更多信息,请参阅dropDatabase
和movePrimary
。
libldap
和libldap_r
对于针对libldap
链接的MongoDB 4.2企业二进制文件(例如在RHEL上运行时),对libldap
的访问是同步的,会产生一些性能/延迟成本。
对于与libldap_r
链接的MongoDB 4.2企业二进制文件,与早期的MongoDB版本相比,行为没有变化。
连接池和LDAP服务器
从4.2版本开始,MongoDB将ldapUseConnectionPool
默认值更改为:
true
在Windows上。true
在Linux上,MongoDB Enterprise二进制文件与libldap_r
链接。
也就是说,在这些系统上,MongoDB默认使用连接池连接到LDAP服务器进行身份验证/授权。
在早期版本(版本4.0.9+)中,MongoDB使用false
作为ldapUseConnectionPool
的默认值。也就是说,默认情况下,MongoDB不使用连接池连接到LDAP服务器进行身份验证/授权。
有关详细信息,请参阅ldapUseConnectionPool
。
删除system.indexes
和system.namespaces
集合
从4.2版本开始,MongoDB删除了system.indexes
和system.namespaces
集合(自v3.0以来不建议使用)。
随着这些集合的删除,从这些角色继承的内置角色clusterManager
、clusterMonitor
、dbAdmin
、read
、restore
和其他角色不再提供直接访问system.indexes
和system.namespaces
集合的特权。
仲裁员降级需要清除数据目录
MongoDB 4.2仲裁器数据文件与MongoDB 4.0不兼容。从MongoDB 4.2降级到4.0需要删除仲裁器数据文件作为中间步骤。对MongoDB 4.2数据文件运行MongoDB 4.0仲裁器可能会导致意外行为。
副本集和分片集群的降级说明包括将仲裁员从4.2降级到4.0的具体步骤:
分片收集和替换文档
从MongoDB 4.2开始
- 替换文档的操作,如
replaceOne()
或update()
(当用于替换文档时),将首先尝试使用查询过滤器来定位单个碎片。如果查询过滤器无法将操作定位到单个碎片,那么它将尝试以替换文档为目标。在早期版本中,这些操作仅尝试使用替换文档定位。 - 不建议使用
save()
方法:改用insertOne()
或replaceOne()
方法。save()
方法不能与未被_id
分片的分片集合一起使用,尝试这样做将导致错误。 - 对于包含
upsert: true
且在分片集合上的替换文档操作,filter
必须在全分片键上包含相等匹配。
4.2 功能兼容性
4.2中的一些功能不仅需要4.2二进制文件,还需要将功能兼容性版本(fCV)设置为4.2。这些功能包括:
- 分布式交易。
- 删除fCV设置为4.2+的MongoDB版本的索引密钥限制。在取消此限制的情况下,
failIndexKeyTooLong
参数对fCV设置为4.2+的MongoDB版本没有影响,仅适用于fCV设置为"4.0"
或更低版本的MongoDB 2.6至MongoDB版本。 - 删除fCV设置为4.2+的MongoDB版本的索引名称长度。
- 唯一索引的新内部格式。新格式既适用于现有的唯一索引,也适用于新创建/重建的唯一索引。
- 从MongoDB 4.2开始,用户不能再使用查询filter
$type: 0
作为$exists:false
的同义词。要查询空字段或缺失字段,请参阅查询空字段或缺失字段。 - MongoDB 4.2添加了通配符索引,以支持用户对自定义字段或集合中的大量字段进行查询的工作负载。