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特定选项:

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或更早版本时运行。

删除对copydbclone命令的支持

从4.2版本开始,MongoDB删除了已弃用的copydb命令和clone命令。

对应的mongo shell助手db.copyDatabase()db.cloneDatabase()只能在连接到MongoDB 4. 0或更早版本时运行。

作为替代方案,用户可以使用mongodumpmongorestore(带有themorestore选项--nsFrom--nsTo)或使用驱动程序编写脚本。

例如,要将test数据库从在默认端口27017上运行的本地实例复制到同一实例上的examples数据库,您可以:

  1. 使用mongodump转储test数据库到archivemongodumpmongodump-test-db

    mongodump --archive="mongodump-test-db" --db=test
    
  2. 使用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命令包括返回结果的avgDistancemaxDistance

    您也可以使用聚合管道返回avgDistance和maxDistance。具体而言,在$geoNear阶段之后,包括一个$group阶段以计算avgDistancemaxDistance

    db.places.aggregate([
       { $geoNear: { near: <...>, distanceField: "dis", includeLocs: "loc", spherical: true, ... } },
       { $group: { _id: null, objectsLoaded: { $sum: 1 }, maxDistance:
             { $max: "$dis" }, avgDistance: { $avg: "$dis" } } }
    ])
    

    另见:

    $geoNear

删除对repairDatabase命令的支持

从4.2版本开始,MongoDB删除了repairDatabase命令及其mongo shell助手db.repairDatabase()以及repairDatabase特权。

作为替代方案:

删除对getPrevError命令的支持

从4.2版本开始,MongoDB删除了过时的getPrevError命令及其mongo shell助手db.getPrevError()

弃用对cloneCollection的支持

MongoDB不赞成cloneCollection命令及其mongo shell助手db.cloneCollection()

作为替代方案,

不建议使用的计划缓存命令/方法

MongoDB不建议使用以下内容:

集合

$out阶段限制

$out和观点

视图定义pipeline不能包括$out阶段。如果您已经有一个包含$out阶段的现有视图,则无法再从此现有视图创建新视图。

对于包含$out阶段的现有视图,您应该在没有$out阶段的情况下droprecreate视图,或者使用不包含$out阶段的新管道replace the view definition

$out$lookup

$lookup阶段不能将$out阶段包含在已加入集合的嵌套管道字段中

$outlinearizable读取关注级别

$out阶段不能与读取关注"linearizable"一起使用。

$out和解释

如果聚合管道包含$out阶段,则不能在executionStats模式或allPlansExecution模式下运行 db.collection.explain()方法(或 explain命令)。

如果聚合管道包含$out阶段,要查看executionStatsallPlansExecution信息,请在没有$out阶段的情况下运行exple解释,以便返回前几个阶段的解释结果。

或者,您可以在queryPlanner模式下为包含$out阶段的聚合管道运行解释。

$outmajority阅读关注级别

从MongoDB 4.2开始,您可以为包含$out阶段的聚合指定读取关注级别"majority"”。

$geoNear中移除limitnum选项

从4.2版本开始,MongoDB删除了$geoNear阶段的limitnum选项以及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"读取关注支持(默认)时,更改流才可用。

另见:

4.2 更改流的更改

默认排序

从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或更高版本。提示一般来说,使用相应的版本mongodumpmongorestore。也就是说,恢复使用特定版本创建的数据文件mongodump,使用相应的版本mongorestore
mongoexport 默认情况下,在Extended JSON v2.0(放松模式)中创建输出数据。如果与--jsonFormat一起使用,则在扩展JSON v2.0(规范模式)中创建输出数据。
mongoimport 默认情况下,预计导入数据处于扩展JSON v2.0(放松模式或规范模式)。如果指定了选项--legacy,可以识别扩展JSON v1.0格式的数据。提示一般来说,版本mongoexportmongoimport应该匹配。也就是说,导入从mongoexport,您应该使用相应的版本mongoimport

有关MongoDB扩展JSON v2的详细信息,请参阅MongoDB扩展JSON(v2)。

--query选项

从4.2版本开始,mongodump --querymongoexport --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上运行 reIndedb.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更改。

服务器状态

  • serverStatusdb.serverStatus()方法以64位整数(即NumberLong)而不是32位整数(即NumberInt)的形式返回操作计数器和操作计数器Repl指标。

记录

  • 登录syslog时,消息文本的格式包括组件。例如:

    ...  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 4.2也不建议更换现有的分片集合。
  • 非原子的明确规范:false选项。

平衡器状态和自动拆分

从MongoDB 6.1开始,不执行自动分割块。这是因为平衡了政策的改进。自动拆分命令仍然存在,但不执行操作。有关详细信息,请参阅平衡策略更改。

在6.1之前的MongoDB版本中:

mongo方法sh.enableBalancing(namespace)sh.disableBalancing(namespace)对自动分割没有影响。

锁定诊断报告

从4.2版本开始,MongoDB报告ReplicationStateTransition锁定信息。

此外,MongoDB 4.2将ParallelBatchWriterMode锁信息与Global锁信息分开。早期的MongoDB版本报告ParallelBatchWriterMode锁定信息作为Global锁的一部分。

有关报告锁定信息的操作,请参阅:

findAndModify查询/排序/投影参数验证

从MongoDB 4.2(以及4.0.12+和3.6.14+)开始,如果指定的查询、排序或投影参数不是文档, findAndModify命令及其关联的mongo shell方法就会出错。

在早期版本中,该操作将非文档查询或排序参数视为空文档{}

参见:

dropDatabasemovePrimary

从MongoDB 4.2开始,

  • 如果您删除数据库并创建一个同名的新数据库,则:
  • 如果使用 movePrimary命令移动未分片的集合,请执行以下任一操作:

这确保了mongos和shard实例刷新其元数据缓存。否则,您可能会错过读取数据,并且可能不会将数据写入正确的碎片。要恢复,您必须手动干预。

在早期版本中,您只需要在它们实例上重新启动或运行flushRouterConfig

有关更多信息,请参阅dropDatabasemovePrimary

libldaplibldap_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.indexessystem.namespaces集合

从4.2版本开始,MongoDB删除了system.indexessystem.namespaces集合(自v3.0以来不建议使用)。

随着这些集合的删除,从这些角色继承的内置角色clusterManagerclusterMonitordbAdminreadrestore和其他角色不再提供直接访问system.indexessystem.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添加了通配符索引,以支持用户对自定义字段或集合中的大量字段进行查询的工作负载。

原文 - Compatibility Changes in MongoDB 4.2

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""