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参数:
newCollectionsUsePowerOf2SizesreplIndexPrefetch
MMAPv1特定命令
MongoDB删除了MMAPv1特定的touch命令。
MMAPv1命令和方法的特定选项
MongoDB删除了MMAPv1特定选项:
noPaddingandusePowerOf2SizesforcollModverboseforcollStatsflagsforcreatepaddingFactor,paddingBytes,preservePaddingfordb.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或主机、用户名、密码和身份验证数据库。
或者,您可以
mongodumptest数据库到标准输出流和管道进入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个字符的事件。在早期版本中,getLog512个字符后截断。从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方法就会出错。
在早期版本中,该操作将非文档查询或排序参数视为空文档{}。
参见:
findAndModifydb.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添加了通配符索引,以支持用户对自定义字段或集合中的大量字段进行查询的工作负载。