MongoDB 4.2的发布说明

分布式索引

笔记:

分布式交易和多文档交易

从MongoDB 4.2开始,这两个术语是同义词。分布式事务是指分片集群和副本集上的多文档事务。多文档事务(无论是在分片集群还是复制集上)也被称为从MongoDB 4.2开始的分布式事务

在4.2版本中,MongoDB引入了分布式事务。分布式交易:

  • 增加了对分片集群上多文档事务的支持。
    • 4.2分片集群的所有成员都必须具有4.2特征兼容性版本
    • 客户端必须使用为MongoDB 4.2更新的MongoDB驱动程序
  • 包含对复制集上事务的现有支持。
    • 4.2副本集的所有成员必须具有4.2特征兼容性版本
    • 客户端必须使用为MongoDB 4.2更新的MongoDB驱动程序
  • 移除了交易的 16MB 总大小限制。在4.2版本中,MongoDB根据需要创建尽可能多的oplog条目(每个最大大小为16MB),以封装事务中的所有写入操作。在MongoDB 4.0中,MongoDB为事务中的所有写入操作创建一个条目,从而对事务施加16MB的总大小限制。
  • 将事务支持扩展到其次要成员使用内存存储引擎的部署。也就是说,事务可用于使用WiredTiger存储引擎进行主服务器,以及WiredTiger或辅助成员内存存储引擎的部署。在MongoDB 4.0中,交易仅适用于仅使用WiredTigerstorage引擎的部署。

有关更多信息,请参阅交易。

另见:

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

移除了命令和方法

删除了命令 删除方法 备注
group db.collection.group() db.collection.aggregate()代替$group阶段。
eval MongoDB 4.2 mongo shell方法db.eval()和db.collection.copyTo()只能在连接到MongoDB 4. 0或更早版本时运行。
copydb 对应的mongo shell助手db.copyDatabase()只能在连接到MongoDB 4. 0或更早版本时运行。作为替代方案,用户可以使用mongodumpmongorestore(见复制和克隆数据库)或使用驱动程序编写脚本。
clone 对应的mongo shell助手db.cloneDatabase()只能在连接到MongoDB 4. 0或更早版本时运行 .作为替代方案,用户可以使用mongodumpmongorestore(见复制和克隆数据库)或使用驱动程序编写脚本。
geoNear db.collection.aggregate()代替$geoNear阶段。有关更多信息,请参阅删除对geoNear命令的支持。
parallelCollectionScan
repairDatabase db.repairDatabase() 有关更多信息,请参阅删除对 therepairDatabase命令的支持。
getPrevError db.getPrevError()

删除maxScan选项

MongoDB删除了maxScanfind命令和mongoshell助手 的不推荐使用的选项cursor.maxScan()。请使用命令maxTimeMS选项 find或帮助程序cursor.maxTimeMS()

MongoDB驱动程序

以下驱动程序的功能与MongoDB 4.2兼容[1]:

C 1.15.0 Java 3.11.0 Python 3.9.0
C# 2.9.0 Node 3.3.0 Ruby 2.10.0
Go 1.1 Perl 2.2.0 Scala 2.7.0

有关支持客户端现场级加密的官方4.2+兼容驱动程序的完整列表,请参阅兼容性。

可重试阅读

可重试读取允许MongoDB 4.2+兼容驱动程序在遇到某些网络或服务器错误时一次性自动重试某些读取操作。有关更多信息,请参阅可重试阅读

分片集群

可变分片键值

从MongoDB 4.2开始,您可以更新文档的分块键值,除非分片键字段是不可变的_id字段。在MongoDB 4.2及更低版本中,文档的分片键字段值是不可变的。

有关更新碎片键的详细信息,请参阅更改文档的碎片密钥值。

备份

mongodumpmongorestore 不能成为4.2多个分片集群的备份策略的一部分,这些集群已经分片正在进行中事务,因为备份创建时使用mongodump 不要保持跨碎片交易的原子性保证。

对于4.2多个具有进行中的分片事务的分片集群,请使用以下协调备份和还原流程之一,这些流程确实保持了跨碎片事务的原子性保证:

平衡器状态和自动拆分

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

在6.1之前的MongoDB版本中:

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

mongos/ mongod连接池

从MongoDB 4.2开始, MongoDB添加参数ShardingTaskExecutorPoolReplicaSetMatching。此参数o定mongod / mongos 实例到分片集群的每个成员的连接池的最小大小。此值在运行时可能会有所变化。

mongodmongos维护与分片集群中每个副本集的辅助副本集的连接池。默认情况下,这些池具有至少与主池的连接数量。

要修改,请参阅ShardingTaskExecutorPoolReplicaSetMatching

分片收集和替换文档

从MongoDB 4.2开始,

  • 替换文档的操作,例如 replaceOne() or update() (when used with a replacement 文档),将首先尝试使用 查询筛选器。如果操作无法通过 查询筛选器,然后尝试通过替换来定位 文件。在早期版本中,这些操作仅尝试 使用替换文档的目标。
  • 不建议使用save()方法:改用insertOne()replaceOne()方法。save()方法不能与_id分片的分片集合一起使用,尝试这样做将导致错误。
  • 对于包含upsert: true且在分片集合上的替换文档操作,filter必须在全分片键上包含相等匹配。

安全改进

已解决的常见漏洞和暴露

MongoDB 4.2包含修复程序,可解决以下常见问题 漏洞和风险(CVE):

新的TLS选项

MongoDB 4.2为mongodmongosmongo shell添加了TLS选项,以取代相应的SSL选项(在4.2中不建议使用)。新的TLS选项提供了与已弃用的SSL选项相同的功能,因为MongoDB一直支持TLS 1.0及更高版本。

  • 对于命令行TLS选项,请参考 mongod, mongos, 和mongo shell页面
  • 有关相应的mongodmongos配置文件选项,请参阅配置文件页面。
  • 有关连接字符串tls选项,请参阅连接字符串页面。

提示:

大多数新的TLS选项名称都与SSL名称相似;例如--tlsMode而不是--sslMode。例外情况是:

另见:

新的tlsClusterCAFile选项

已弃用的SSL选项

MongoDB 4.2不推荐使用mongod、mongos和mongo shell的SSL选项以及相应的net.ssl Options配置文件选项。

使用新的TLS改为选项。

新的tls参数

新参数 描述
tlsWithholdClientCertificate 适用于 mongod 以及 mongos, 该参数可以被设置为 true 停止实例 发送其 TLS 启动群集内时的证书 与他人的通信 mongodmongos 实例。有关详细信息,请参见 tlsWithholdClientCertificate
tlsX509ClusterAuthDNOverride 适用于mongodmongos,该参数可以设置为替代证书DN,用于x.509会员身份验证。有关详细信息,请参阅tlsX509ClusterAuthDNOverride您可以使用此参数滚动更新证书到包含新DN值的新证书。请参阅包含新DN的x.509集群证书的滚动更新。

新的tlsClusterCAFile选项

MongoDB 4.2为mongodmongos添加了--tlsClusterCAFile选项/net.tls.clusterCAFile,该选项指定了一个.pem文件,用于从建立连接的客户端验证TLS证书。这允许您使用单独的证书颁发机构来验证TLS握手的客户端到服务器和服务器到客户端部分。

另见:

新的TLS选项

前向保密

从Linux上的4.2版本开始:

在早期版本的MongoDB(3.6.14+和4.0.3+)中,如果Linux平台的OpenSSL支持ECDH参数的自动曲线选择,则MongoDB支持短暂椭圆曲线Diffie-Hellman(ECDHE)。

在Windows和macOS上,MongoDB对ECDHE和DH的支持与早期版本保持不变;也就是说,通过使用平台各自的原生TLS/SSL操作系统库,支持是隐含的。

有关更多信息,请参阅前瞻性保密。

passwordPrompt()

从mongo shell的4.2版开始,您可以将passwordPrompt()方法与各种 用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在 方法/命令调用中指定密码。但是,您仍然可以像使用早期版本的mong。 shell那样直接指定密码。

例如:

db.createUser( {
   user:"user123",
   pwd: passwordPrompt(),   // Instead of specifying the password in cleartext
   roles:[ "readWrite" ]
} )

密钥文件格式更改为YAML

从MongoDB 4.2开始,用于内部成员身份验证的密钥文件使用YAML格式允许密钥文件中的多个密钥。YAML格式接受以下内容:

  • 单个键字符串(与早期版本相同),
  • 多个键字符串(每个字符串必须用引号括起来),或
  • 键串序列。

YAML格式与使用文本文件格式的现有单键密钥文件兼容。

新格式允许在不停机的情况下滚动升级按键。请参阅复制集的旋转键碎片集群的旋转键。

libldaplibldap_r

对于针对libldap链接的MongoDB 4.2企业二进制文件(例如在RHEL上运行时),对libldap的访问是同步的,会产生一些性能/延迟成本。

对于与libldap_r链接的MongoDB 4.2企业二进制文件,与早期的MongoDB版本相比,行为没有变化。

加密存储引擎

对于配置了AES256-GCM密码的加密存储引擎

  • 从热备份恢复

    从4.2开始,如果您从通过“热”备份(即mongod正在运行)获取的文件恢复,MongoDB可以在启动时检测到“脏”密钥,并自动滚动数据库密钥,以避免IV(初始化矢量)重用。

  • 从冷备份恢复

    但是,如果您从通过“冷”备份(即它们没有运行)进行恢复,MongoDB无法在启动时检测到“脏”密钥,重复使用IV使机密性和完整性保证无效。从4.2开始,为了避免从冷文件系统快照恢复后重用密钥,MongoDB添加了一个新的命令行选项--eseDatabaseKeyRollover。当使用--eseDatabaseKeyRollover选项时,mongod实例滚动到配置为AES256-GCM密码的数据库密钥上并退出。

有关更多信息,请参阅加密存储引擎--eseDatabaseKeyRollover

客户端字段级加密

官方的MongoDB 4.2+兼容驱动程序提供了一个客户端字段级加密框架。应用程序可以在通过电线将数据传输到服务器加密文档中的字段。只有能够访问正确加密密钥的应用程序才能解密和读取受保护的数据。删除加密密钥将使使用该密钥加密的所有数据永久不可读。

有关支持客户端字段级加密的官方4.2+兼容驱动程序的完整列表,请参阅兼容性。

有关使用选择MongoDB 4.2+兼容驱动程序配置字段级加密的端到端过程,请参阅客户端字段级加密指南。

字段的显式(手动)加密

官方MongoDB 4.2+兼容驱动程序和MongoDB 4.2或更高版本 mongo shell支持显式加密或解密 具有特定数据加密密钥和加密算法的字段。

应用程序必须修改与构建读写操作相关的任何代码,以通过驱动程序加密库包含加密/解密逻辑。应用程序负责在每次操作的基础上选择适当的数据加密密钥进行加密/解密。

有关更多信息,请参阅显式加密。

字段自动加密

企业功能

现场级加密的自动功能仅在MongoDB Enterprise 4.2或更高版本和MongoDB Atlas 4.2或更高版本集群中可用。

官方MongoDB 4.2+兼容驱动程序和MongoDB 4.2或更高版本 mongoShell支持在读写操作中自动加密字段。

应用程序必须使用自动加密配置设置创建数据库连接对象(例如MongoClient)。配置设置必须包括使用严格子集的自动加密加密规则JSON Schema Draft 4标准语法和特定于加密的模式关键字。应用程序不必修改与构建读/写操作相关的代码。有关自动加密规则的完整文档,请参阅加密模式

有关更多信息,请参阅自动加密

有关客户端字段级加密的完整文档,请参阅客户端字段级加密。

一般安全增强功能

  • serverStatus添加到backup内置角色中。

  • 要通过TLS/SSL连接连接客户端,MongoDB 4.2支持IP地址匹配以及主题替代名称(SAN)匹配的DNS。

    例如,mongod实例的x.509证书具有以下SAN

    X509v3 Subject Alternative Name:
        DNS:hostname.example.com, DNS:localhost, IP Address:127.0.0.1
    

    然后,要将mongo shell连接道实例,您可以指定127.0.0.1的主机或DNS名称

    • mongo "mongodb:\\127.0.0.1:27017\test" --tls --tlsCAFile /etc/ssl/ca.pem ...
      
    • "mongodb:\\hostname.example.com:27017\test" --tls --tlsCAFile /etc/ssl/ca.pem ...
      
    • mongo "mongodb:\\localhost:27017\test" --tls --tlsCAFile /etc/ssl/ca.pem ...
      

    在之前的版本中,MongoDB仅支持用于SAN匹配的DNS条目。

    • mongo "mongodb:\\hostname.example.com:27017\test" --tls --tlsCAFile /etc/ssl/ca.pem ...
      
    • mongo "mongodb:\\localhost:27017\test" --tls  --tlsCAFile /etc/ssl/ca.pem ...
      

LDAP查询模板{PROVIDED_USER}令牌

从4.2版本开始,MongoDB Enterprise添加了一个新的令牌{PROVIDED_USER},可用于insecuritysecurity.ldap.authz.queryTemplate。在模板中使用时,MongoDB会替换提供的用户名,即在身份验证或LDAP transformation之前

聚合改进

按需实例化视图($merge阶段)

MongoDB 4.2增加了$merge聚合阶段。

在新阶段,您可以:

  • 可以输出到相同或不同数据库中的集合。
  • 可以将结果(合并文档、替换文档、保留现有文档、操作失败、使用自定义更新管道处理文档)集成到现有集合中。
  • 可以输出到现有的分片集合。

新阶段允许用户创建按需实例化视图,每次运行管道时都可以逐步更新输出集合的内容。

聚合三角学表达式

MongoDB 4.2添加了新的三角学表达式,用于聚合管道。

三角学表达式对数字执行三角运算。表示角度的值总是以弧度输入或输出。使用$degreesToRadians$radiansToDegrees在度量和弧度测量之间转换。

姓名 描述
$sin 返回以弧度测量的值的正弦。
$cos 返回以弧度测量的值的余弦。
$tan 返回以弧度测量的值的切线。
$asin 以弧度为单位返回值的逆 sin(弧正弦)。
$acos 返回以弧度为单位的值的逆余弦(弧余弦)。
$atan 返回以弧度为单位的值的逆切线(弧切线)。
$atan2 返回y / x在弧度中的逆切线(弧切线),其中yx分别是传递给表达式的第一个和第二个值。
$asinh 返回弧度值的逆双曲正弦(双曲弧正弦)。
$acosh 返回弧度值的逆双曲余弦(双曲弧余弦)。
$atanh 返回弧度值的逆双曲切线(双曲弧切线)。
$sinh 返回测量到的内膜值的双曲正弦。
$cosh 返回测量的内亚线值的双曲余弦。
$tanh 返回测量到的内膜值的双曲切线。
$degreesToRadians 将值从度转换为弧度。
$radiansToDegrees 将值从弧度转换为度。

聚合算术表达式

MongoDB 4.2添加了$round聚合表达式。使用$round将数字值四舍五入到特定数字或小数位。

MongoDB 4.2为$trunc添加了扩展的功能和新的语法。使用带有新语法的$trunc将数值截断为特定数字或小数位。

聚合正则表达式(正则表达式)运算符

MongoDB 4.2添加了以下正则表达式(正则表达式)模式匹配运算符,用于聚合管道:

运算符号 描述
$regexFind 将正则表达式(正则表达式)应用到字符串上,并返回第一个匹配子字符串上的信息。
$regexFindAll 将正则表达式(正则表达式)应用到字符串上,并返回所有匹配子字符串的信息。
$regexMatch 将正则表达式(正则表达式)应用到字符串,如果找到匹配项,则返回true,如果未找到匹配项,则返回false

在MongoDB 4.2之前,聚合管道只能在$match阶段使用查询操作器$regex

新阶段

MongoDB 4.2添加了以下新的聚合管道阶段:

新阶段 描述
$merge 将聚合结果写入集合。$merge阶段可以将结果(合并文档、替换文档、保留现有文档、操作失败、使用自定义更新管道处理文档)集成到现有集合中。
$planCacheStats 提供集合的计划缓存信息。与4.2中不建议使用的以下方法和命令相比,$planCacheStats聚合阶段更受欢迎:PlanCache.getPlansByQuery()method/planCacheListPlans命令,以及PlanCache.listQueryShapes()method/planCacheListQueryShapes命令。 提示另见:不建议使用的计划缓存命令/方法
$replaceWith 将输入文档替换为指定的文档。该操作取代了输入文档中的所有现有字段,包括_id字段。新的$replaceWith阶段是$replaceRoot阶段的别名。
$set 向文档添加新字段。该阶段输出包含输入文档中所有现有字段以及新添加字段的文档。新的$set阶段是$addFields阶段的别名。
$unset 从文档中排除字段。新的$unset阶段是$project阶段的别名,不包括字段。

新变量

MongoDB 4.2添加了以下新的聚合管道变量:

变量 描述
NOW 返回当前日期时间值。
CLUSTER_TIME 返回当前时间戳值。仅适用于复制集和分片集群。

可用性

从MongoDB 4.2开始,您可以使用聚合管道进行更新:

指挥权 mongosh方法
findAndModify db.collection.findOneAndUpdate()db.collection.findAndModify()
update db.collection.updateOne()db.collection.updateMany()Bulk.find.update()Bulk.find.updateOne()Bulk.find.upsert()

对于更新,管道可以包括以下几个阶段:

使用聚合管道可以进行更具表现力的更新语句,例如根据当前字段值表达条件更新,或使用另一个字段的值更新一个字段。

有关详细信息和示例,请参阅各个参考页面。

另见:

更改流

startAfter更改流选项

MongoDB 4.2添加了startAfter作为更改流的选项,该选项在恢复令牌指示的事件后启动新的更改流。使用此选项,您可以从无效事件启动更改流,从而保证在上一个流无效后不会错过通知。

更改流恢复令牌

MongoDB 4.2使用版本1(即v1)更改流恢复令牌该令牌在版本4.0.7中引入。

从MongoDB 4.2开始,如果更改流聚合管道修改事件的_id字段,更改流将抛出异常。

可用性

从MongoDB 4.2开始,无论"majority"读取关注支持如何,更改流都是可用的;也就是说,读取关注majority支持可以启用(默认)或禁用以使用更改流。

在MongoDB 4.0及更早版本中,只有当启用"majority"读取关注支持(默认值)时,更改流才可用。

更改流管道

从MongoDB 4.2开始,您可以使用更改流聚合管道中的其他阶段来修改更改流输出(即事件文档):

从MongoDB 4.2开始,如果更改流聚合管道修改事件的_id字段,更改流将抛出异常。

另见:

更改流兼容性更改

更新增强功能

从MongoDB 4.2开始,您可以使用聚合管道进行更新:

指挥权 mongosh方法
findAndModify db.collection.findOneAndUpdate()db.collection.findAndModify()
update db.collection.updateOne()db.collection.updateMany()Bulk.find.update()Bulk.find.updateOne()Bulk.find.upsert()

对于更新,管道可以包括以下几个阶段:

使用聚合管道可以进行更具表现力的更新语句,例如根据当前字段值表达条件更新,或使用另一个字段的值更新一个字段。

有关详细信息和示例,请参阅各个参考页面。

更新和提

从MongoDB 4.2开始, update命令和相关的mongo shell方法 db.collection.update()可以接受一个hint参数来指定要使用的索引。见

分片收集和替换文档

从MongoDB 4.2开始

  • 替换文档的操作,如 replaceOne()update() () (当与替换文档一起使 用时),将首先尝试使用查询过滤器以单个碎片为目标。如果该操作无法通 过查询筛选器定位单个碎片,则尝试通过替换文档定位。在早期版本中,这 些操作仅尝试使用替换文档定位。
  • 不建议使用save()方法:改用insertOne()replaceOne()方法。save()方法不能与_id分片的分片集合一起使用,尝试这样做将导致错误。
  • 对于包含upsert: true且在分片集合上的替换文档操作,filter必须在全分片键上包含相等匹配。

通配符索引

MongoDB 4.2引入了通配符索引,用于支持对名称未知或任意的字段的查询。

考虑一个在userMetadata字段下捕获用户定义数据并支持对该数据进行查询的应用程序:

{ "userMetadata" : { "likes" : [ "dogs", "cats" ] } }
{ "userMetadata" : { "dislikes" : "pickles" } }
{ "userMetadata" : { "age" : 45 } }
{ "userMetadata" : "inactive" }

管理员希望创建索引来支持userMetadata任何子字段上的查询。

userMetadata上的通配符索引可以支持userMetadatauserMetadata.likesuserMetadata.dislikesuserMetadata.age单字段查询:

db.userData.createIndex( { "userMetadata.$**" : 1 } )

该索引可以支持以下查询:

db.userData.find({ "userMetadata.likes" : "dogs" })
db.userData.find({ "userMetadata.dislikes" : "pickles" })
db.userData.find({ "userMetadata.age" : { $gt : 30 } })
db.userData.find({ "userMetadata" : "inactive" })

userMetadata上的非通配符索引只能支持对userMetadata值的查询。

重要:

通配符索引不是为了取代基于工作负载的索引规划而设计的。有关创建索引以支持查询的更多信息,请参阅创建索引以支持您的查询。有关通配符索引限制的完整文档,请参阅符卡索引限制。

mongod功能CompatibilityVersion必须为4.2才能创建通配符索引。有关设置fCV的说明,请参阅MongoDB 6.0部署上的设置功能兼容性版本。

您可以使用createIndexes数据库命令或其shell助手db.collection.createIndex()db.collection.createIndexes()创建通配符索引。有关创建通配符索引的示例,请参阅创建通配符索引。

有关完整的文档,请参阅通配符索引

平台支持

  • MongoDB 4.2增加了对以下内容的支持:
    • ARM64上的Ubuntu 18.04
  • MongoDB 4.2取消了对以下内容的支持:
    • Debian 8
    • Ubuntu14.04
    • Ubuntu 16.04 ARM64 for MongoDB社区版
    • Ubuntu 16.04 POWER/PPC64LE(也在3.6.13和3.4.21版本中删除)
    • macOS 10.11

MongoDB工具

FIPS模式

从4.2版本开始,MongoDB删除了以下程序的--sslFIPSMode选项:

如果 mongod / mongos实例被配置为使用FIPS模式,则程序将使用与 mongod / mongos兼容的FIPS连接。

--uri选项

从4.2版本开始

  • 对于以下数据库工具,如果在--uri连接字符串和--writeConcern选项中都指定了写入问题,--writeConcern选项将覆盖连接字符串中的选项:
  • 对于以下数据库工具,如果在--uri连接字符串和--readPreference选项中都指定了读取首选项,则--readPreference选项将覆盖连接字符串中的选项:

扩展JSON v2

从4.2版本开始:

二进制 变化
bsondump 使用扩展JSON v2.0(规范模式)格式。
mongodump 对元数据使用扩展JSON v2.0(规范模式)格式。需要mongorestore支持扩展JSON v2.0(规范模式或放松模式)格式的4.2或更高版本。 提示:一般来说,使用相应的版本mongodumpmongorestore。也就是说,恢复使用特定版本创建的数据文件mongodump,使用相应的版本mongorestore
mongoexport 默认情况下,在扩展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选项

mongofiles

这个mongofiles命令get_iddelete_id可以接受_id的ObjectId或非ObjectId值。

mongoimportmongorestore

mongoimport

从4.2版本开始:

  • mongoimport使用最大批处理大小为100,000来执行批量插入/插入操作。
  • mongoimport默认情况下,当它遇到重复的密钥和文档验证错误时,请继续。为了确保程序停止这些错误,请指定--stopOnError
  • 指定--maintainInsertionOrdermongoimport
    • 使用有序的批量写入操作维护文档插入顺序;即维护批处理中的批处理顺序和文档顺序。在早期版本中,仅维护批处理顺序;批处理中的文档顺序不维护。
    • 启用--stopOnError,并将numInsertionWorkers设置为1。
mongorestore

从4.2版本开始:

  • mongorestore默认情况下,当它遇到重复的密钥和文档验证错误时,请继续。为了确保程序停止这些错误,请指定--stopOnError
  • 指定--maintainInsertionOrdermongorestore
    • 使用有序的批量写入操作维护文档插入顺序;即维护批处理中的批处理顺序和文档顺序。在早期版本中,仅维护批处理顺序;批处理中的文档顺序不维护。
    • 启用--stopOnError并将--numInsertionWorkersPerCollection设置为1。

特定DDL操作的锁定优化

从MongoDB 4.2开始,以下操作采用独家收集锁,而不是独家数据库锁:

命令 方法
create db.createCollection()db.createView()
createIndexes db.collection.createIndex()db.collection.createIndexes()
drop db.collection.drop()
dropIndexes db.collection.dropIndex()db.collection.dropIndexes()
renameCollection db.collection.renameCollection()

在MongoDB 4.2之前,这些操作对数据库进行了独家锁定,在操作完成之前阻止数据库及其收集上的所有操作。

在早期版本中,get_iddelete_id只能接受_id的ObjectId值。

监视

从4.2版本开始,存储节点监视器有MongoDB社区版和MongoDB企业版。

在早期版本中,该功能仅在MongoDB Enterpriseedition中可用。

流量控制

MongoDB 4.2引入了一种流量控制机制,以控制主服务器应用写入的速度,从而将majority committed保持在指定的最大值下。

默认情况下enabled流量控制。

笔记:

要进行流控制,副本集/分片群集必须具有: featureCompatibilityVersion (FCV)为4.2并且读取关注多数启用 。也就是说,如果FCV不是4.2或如果读关注多数被禁用,则启用的 流控制没有效果。

有关更多信息,请参阅复制滞后和流量控制。

记录和诊断

记录

  • 在日志消息中添加了INITSYNC组件。

  • 在日志消息中添加了ELECTION组件。

  • 对于调试消息,包括详细级别(即D 【1-5】)。例如,如果详细级 别为2, MongoDB记录D2。在以前的版本中, MongoDB日志消息 只指定D作为Debug级别。

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

    ...  ACCESS   [repl writer worker 5] Unsupported modification to roles collection ...
    

    以前,syslog消息文本不包括该组件。例如:

    ... [repl writer worker 1] Unsupported modification to roles collection ...
    
  • MongoDB 4.2为聚合操作的探查器日志消息和诊断日志消息添加了一个usedDisk指示器。usedDisk指示聚合操作的任何阶段是否由于内存限制而将数据写入临时文件。有关聚合内存限制的详细信息,请参阅Memory Restrictions。

  • 从4.2版本开始(也从4.0.6开始可用),副本集的次要成员现在记录需要超过慢操作阈值才能应用的操作操作时间更长的操作条目。这些消息在REPL组件下为次要logged,文本applied op: <oplog entry> took <num>ms

    2018-11-16T12:31:35.886-0500 I REPL   [repl writer worker 13] applied op: command { ... }, took 112ms
    

    二级应用程序日志的缓慢操作日志应用程序日志是:

  • 有关设置慢操作阈值的更多信息,请参阅

  • 从MongoDB 4.2开始,getLog命令截断任何包含超过1024个字符的事件。在早期版本中,getLog512个字符后截断。

  • 从MongoDB 4.2(和4.0.9开始),对于缓慢的操作,分析器条目诊断日志消息包括storage信息。

  • 从MongoDB 4.2开始,用于读/写操作的分析器条目诊断日志消息(即mongod/mongos日志消息)包括:

    查询计划改进。

currentOp

MongoDB 4.2在$currentOp聚合阶段添加了一个新的选项idleCursors,以返回空闲光标上的信息。

此外,MongoDB 4.2向从$currentOp聚合阶段、currentOp命令和db.currentOp()帮助程序返回的文档中添加了以下新字段:

$currentOp currentOp/db.currentOp() 描述
$currentOp.type currentOp.type 指定报告的操作是否为opidleSession、oridleCursor。
$currentOp.cursor currentOp.cursor 指定光标详细信息。返回getmoreoridleCursor信息时可用。
$currentOp.effectiveUsers currentOp.effectiveUsers 指定与操作关联的用户。
$currentOp.prepareReadConflicts currentOp.prepareReadConflicts 指定当前操作必须等待带有写入提交或中止的准备事务的次数。
$currentOp.runBy currentOp.runBy 指定正在为操作模拟有效用户的用户。
$currentOp.writeConflicts currentOp.writeConflicts 指定当前操作与另一个写入操作冲突的次数。

参见:4.2当前操作兼容性更改

serverStatus度量

从MongoDB 4.2开始, serverStatus命令和mongo shell法 db.serverStatus() 包括以下输出更改

更新了 变化
shardingStatistics 添加了新字段:shardingStatistics.countDocsClonedOnRecipientshardingStatistics.countDocsClonedOnDonorshardingStatistics.countDocsDeletedOnDonorshardingStatistics.countRecipientMoveChunkStartedshardingStatistics.countDonorMoveChunkLockTimeout
metrics.repl.network 添加了新字段:metrics.repl.network.notMasterLegacyUnacknowledgedWritesmetrics.repl.network.notMasterUnacknowledgedWrites
metrics.repl 添加了新的metrics.repl.stepDown指标:metrics.repl.stepDown.userOperationsKilledmetrics.repl.stepDown.userOperationsRunning
transactions 现在可用于mongos(以前仅适用于mongod添加了mongod实例的新字段:transactions.totalPreparedtransactions.totalPreparedThenCommittedtransactions.totalPreparedThenAbortedtransactions.currentPrepared
logicalSessionRecordCache 添加了新字段logicalSessionRecordCache.sessionCatalogSize
locks ParallelBatchWriterModeGlobal锁定信息分开。添加ReplicationStateTransition锁定信息。

副本集状态指标

Starting in version MongoDB 4.2, replSetGetStatus and its mongo shell helper rs.status() return:

MongoDB 4.2不建议使用lastStableCheckpointTimestamp字段

锁定诊断报告

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

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

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

collStats改进

从MongoDB 4.2开始,$collStats聚合、 collStats命令和mongo shell helper db.collection.stats()返回有关索引信息,这些信息 正在建造中。

有关详细信息,请参阅:

从MongoDB 4.2开始,$collStats聚合,则 collStats命令,然后使用蒙戈壳 助手数据库集合统计信息()退回比例因子习惯 缩放各种尺寸的数据。

dbStats改进

从MongoDB 4.2开始,数据库统计命令,然后使用 蒙戈外壳辅助程序数据库统计信息()返回 该比例因子用于缩放各种尺寸数据。

一般改进

配置文件的外部来源值

MongoDB支持使用 扩展指令配置中 文件以加载外部来源的值。扩展指令可以 特定负载值 配置文件选项加载 整个配置文件。

以下扩展指令可用:

扩张指令 说明
__rest 允许用户指定 REST 端点作为外部源 用于配置文件选项 完整的配置文件。
__exec 允许用户将shell或terminal命令指定为 配置文件选项的外部源 该 完整配置文件。

有关完整文档,请参见外部来源配置文件值。

输出配置选项

MongoDB 4.2添加了 --outputConfig选项,用于mongod和mongos的选项,该备选办法输出到标准输出mongod / mongos实例的配置,采用YAML格式。

如果配置使用任何外部来源的配置文件值,则 选项返回这些选项的解析值。

警告:

这可能包括之前配置的任何密码或密码 通过外部来源混淆。

有关用法示例,请参见:

删除索引键大小限制

从MongoDB 4.2开始,用于功能兼容性版本设为"4.2"或更高,MongoDB将删除 索引键限制。对于fCV设置为"4.0",极限依旧 适用。

另见:

4.2索引兼容性更改

删除索引名称长度限制

从版本4.2开始,对于设置为“4.2”或更高版本的 featureCompatibilityVersion,MongoDB删除了最大127字节的索引名称长度限制。在以前 版本或MongoDB版本featureCompatibilityVersion(fCV)设置为“4.0”,则索引名称必须在

另见:

4.2索引兼容性更改

4.2功能兼容性

改进删除索引

删除多个索引

从MongoDB 4.2开始,您可以为 dropIndexes 命令及其mongo shell助手 db.collection.dropIndexes().指定多个 要删除的索引,请将索引名称数组传递给 dropIndexes/db.collection.dropIndexes().

仅终止相关查询

从MongoDB 4.2开始 dropIndexes 或其shell辅助程序 dropIndex() 以及 dropIndexes() 操作只会杀死 正在使用要删除的索引的查询。这可能包括 查询将索引视为 查询规划。

在MongoDB4.2之前,删除一个 集合将终止该集合上所有打开的查询。

zstd可用性

从版本4.2开始,MongoDB支持zstd

事务内部的bulkWrite()错误处理

从MongoDB 4.2开始,如果 db.collection.bulkWrite()操作在事务内部遇到错误,该方法将抛出BulkWriteException(与事务外部相同)。

在4.0中,如果bulkWrite操作在 事务时,引发的错误不会包装为 批量写入异常

在事务内,大容量写入中的第一个错误将导致 整个大容量写入失败并中止事务,即使 批量写入是无序的。

查询计划改进

计划缓存状态

从MongoDB 4.2开始,该高速缓存条目与一个状态相关联:

将状态与条目相关联有助于减少以下情况的可能性 次优高速缓存条目保留在高速缓存中。如需了解更多信息, see Query Plans。

查询哈希计划缓存密钥

这些字段也可用于返回信息的操作 关于查询计划高速缓存:

  • $planCacheStats聚合阶段(MongoDB 4.2中的新增功能
  • planCacheListQueryShapes()方法/planCacheListQueryShapes命令(在MongoDB 4.2中已弃用)
  • 方法/计划缓存列表计划命令(在MongoDB 4.2中已弃用)

另见:

弃用的计划缓存命令/方法

$regex$not

从MongoDB 4.2(和4.0.7)开始,$未运算符可以执行逻辑 操作于$正则表达式运算符表达式以及 正则表达式对象(即/模式/).

在4.0及更早版本中,可以将$not运算符与 正则表达式对象(即/pattern/),但不使用 $regex运算符表达式。

删除自己的游标

从MongoDB4.2开始,用户总是可以杀死自己的游标, 而不管用户是否具有特权 删除光标。因此,killCursors 特权在MongoDB 4.2中起不起作用。

在MongoDB 4.0中,用户需要killCursors权限 以杀死它们自己的光标。

新参数

MongoDB 4.2添加了参数 replBatchLimitBytes来配置最大操作日志应用程序批处理大小。从MongoDB 4.0.10开始,该参数也可用。

对某些单文档向上插入的可重试写入

MongoDB 4.2将重试某些单文档upsert(upsert更新:真实和多重:false),其遇到重复键异常。有关条件,请参见 Duplicate Key Errors on Upsert

在MongoDB4.2之前,MongoDB不会重试upsert操作 遇到了重复键错误

db.dropDatabase()和写入关注点

从MongODB 4.2开始,mongo shell方法 dropDatabase()可以接受一个可选的写关注文档。

丢弃连接

dropConnections命令删除mongod / mongos实例到指定主机的传出连接。 dropConnections必须针对管理数据库运行。

客户端断开连接

对于以下操作,如果在操作完成之前,发布客户端断开连接,MongoDB将以下操作标记为终止(例如,对操作执行killOp):

命令 mongo shell方法 附注
aggregate db.collection.aggregate() 行为仅在管道不包括 $out 以及 $merge
authenticate db.auth()
count db.collection.count()db.collection.countDocuments()db.collection.estimatedDocumentCount()
distinct db.collection.distinct()
find db.collection.find()db.collection.findOne()
getnonce
isMaster
listCollections db.getCollectionInfos()db.getCollectionNames()
listDatabases
listIndexes db.collection.getIndexes()

启动警告

内存中存储引擎

从版本4.2(以及4.0.13和3.6.14)开始,如果副本集成员使用内存中存储引擎(表决或非表决),但副本集将writeConcernMajorityJournalDefault(表决或非表决),但副本集将writeConcernMajorityJournalDefault设置为true,则副本集成员将记录启动警告。

mongo Shell

从MongoDB 4.2(和4.0.13)开始,mongo shell显示一个 连接到非正版MongoDB实例时显示警告消息 这些实例的行为可能与官方MongoDB不同 实例;例如,缺失或不完整的特征、不同的特征 行为等等。

Map-Reduce

从4.2版本开始,MongoDB弃用:

  • 也可以使用map-reduce选项创建新的分片集合 因为使用分片选项 地图缩小。若要输出到分片集合,请创建分片 先收集。MongoDB 4.2还反对替换 现有的分片集合。
  • 的显式规范非原子:假选项卡页面上创建或编辑条目.

回滚时间限制

从MongoDB 4.2开始,回滚时间限制计算为 公共点之后的第一个操作和 操作日志以使成员回滚。

在MongoDB 4.0中,回滚时间限制是在 公共点和操作日志中要滚动的成员的最后一个点 回来。

有关详细信息,请参阅回滚运行时间限制。

isInteractive()

MongoDB 4.2添加了一个新的mongo shell方法 isInteractive(),它返回一个布尔值,指示 mongo shell正在以交互或脚本模式运行。

变更以解释输出

从MongoDB 4.2开始,解释输出可以包含一个新的optimizedPipeline字段。有关详细信息,请参阅optimizedPipeline

更改为isMaster输出

从MongoDB 4.2开始,isMaster的输出和db.isMaster()helper方法返回mongod / mongos实例到客户机的连接的isMaster.connectionId。

优化的索引生成

针对已填充集合构建MongoDB索引需要针对该集合的独占读写锁。需要对集合进行读锁或写锁的操作必须等到mongod释放锁。MongoDB使用一个优化的构建过程,该过程只在索引构建的开始和结束时持有排它锁。构建过程的其余部分将交替执行读和写操作。

对于功能兼容版本(FCV)4. 2, MongoDB4.2索引构建完全取代了索引构建过程 在以前的MongoDB版本中支持。MongoDB忽略 后台索引构建选项(如果指定为 创建索引或其外壳帮助程序 创建索引()创建索引()

需要功能兼容性版本4.2 对于从4.0升级到4.2的MongoDB集群,您必须将功能兼容版本(fcv) 设置为4.2以启用优化的构建过程。有关设置fCV的详细信息,请参见setFeatureCompatibilityVersion。 运行fCV 4.0的MongoDB 4.2集群仅支持4.0索引构建。

有关索引生成过程的完整文档,请参见Index Builds on Populated Collections.

影响兼容性的变更

某些更改可能会影响兼容性,并且可能需要用户操作。为 兼容性更改的详细列表,请参见 MongoDB 4.2中的兼容性更改。

升级程序

功能兼容性版本

要升级,4.0实例必须具有 功能兼容性版本设置为4.0。要检查版本:

db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

关验证和设置 功能兼容性版本以及有关其他 升级的先决条件/注意事项,请参阅 升级说明:

如果您需要升级到4.2的指导,MongoDB专业服务提供 主要版本升级支持,以帮助确保平稳过渡 而不会中断MongoDB应用程序。

下载

要下载MongoDB4.2,请访问MongoDB下载中心

已知问题

版本中 问题 现况
4.2.0 SERVER-43075:缺失 storage.journal.commitIntervalMs 在4.2.1中修复

报告问题

要报告问题,请参阅 https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports为 关于如何为MongoDB服务器提交JIRA票证的说明 有关项目的资料。

译者:韩鹏帅 参见

原文 - Release Notes for MongoDB 4.2

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

results matching ""

    No results matching ""