MongoDB 4.2的发布说明
分布式索引
笔记:
分布式交易和多文档交易
从MongoDB 4.2开始,这两个术语是同义词。分布式事务是指分片集群和副本集上的多文档事务。多文档事务(无论是在分片集群还是复制集上)也被称为从MongoDB 4.2开始的分布式事务
在4.2版本中,MongoDB引入了分布式事务。分布式交易:
- 增加了对分片集群上多文档事务的支持。
- 4.2分片集群的所有成员都必须具有
4.2
的特征兼容性版本。 - 客户端必须使用为MongoDB 4.2更新的MongoDB驱动程序
- 4.2分片集群的所有成员都必须具有
- 包含对复制集上事务的现有支持。
- 4.2副本集的所有成员必须具有
4.2
的特征兼容性版本。 - 客户端必须使用为MongoDB 4.2更新的MongoDB驱动程序
- 4.2副本集的所有成员必须具有
- 移除了交易的 16MB 总大小限制。在4.2版本中,MongoDB根据需要创建尽可能多的oplog条目(每个最大大小为
16MB
),以封装事务中的所有写入操作。在MongoDB 4.0中,MongoDB为事务中的所有写入操作创建一个条目,从而对事务施加16MB的总大小限制。 - 将事务支持扩展到其次要成员使用内存存储引擎的部署。也就是说,事务可用于使用WiredTiger存储引擎进行主服务器,以及WiredTiger或辅助成员内存存储引擎的部署。在MongoDB 4.0中,交易仅适用于仅使用WiredTigerstorage引擎的部署。
有关更多信息,请参阅交易。
另见:
移除了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``usePowerOf2Sizes
collMod
verbose
为了collStats
flags
为了create
- 为
db.createCollection()
方法和compact
命令提供paddingFactor、paddingBytes和preservePadding。 repair
为了mongodump
移除了命令和方法
删除了命令 | 删除方法 | 备注 |
---|---|---|
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或更早版本时运行。作为替代方案,用户可以使用mongodump 和mongorestore (见复制和克隆数据库)或使用驱动程序编写脚本。 |
|
clone |
对应的mongo shell助手db.cloneDatabase()只能在连接到MongoDB 4. 0或更早版本时运行 .作为替代方案,用户可以使用mongodump 和mongorestore (见复制和克隆数据库)或使用驱动程序编写脚本。 |
|
geoNear |
db.collection.aggregate() 代替$geoNear 阶段。有关更多信息,请参阅删除对geoNear 命令的支持。 |
|
parallelCollectionScan |
||
repairDatabase |
db.repairDatabase() |
有关更多信息,请参阅删除对 therepairDatabase命令的支持。 |
getPrevError |
db.getPrevError() |
删除maxScan
选项
MongoDB删除了maxScan
该 find
命令和mongo
shell助手 的不推荐使用的选项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及更低版本中,文档的分片键字段值是不可变的。
有关更新碎片键的详细信息,请参阅更改文档的碎片密钥值。
备份
mongodump
和mongorestore
不能成为4.2多个分片集群的备份策略的一部分,这些集群已经分片正在进行中事务,因为备份创建时使用mongodump
不要保持跨碎片交易的原子性保证。
对于4.2多个具有进行中的分片事务的分片集群,请使用以下协调备份和还原流程之一,这些流程确实保持了跨碎片事务的原子性保证:
平衡器状态和自动拆分
从MongoDB 6.1开始,不执行自动分割块。这是因为平衡了政策的改进。自动拆分命令仍然存在,但不执行操作。有关详细信息,请参阅平衡策略更改。
在6.1之前的MongoDB版本中:
该
balancerStart
命令和mongo
shell帮助程序方法sh.startBalancer()
andsh.setBalancerState(true)
还启用了分片群集的自动拆分要在启用平衡器时禁用自动拆分,您可以使用
sh.disableAutoSplit()
。该
balancerStop
命令和mongo
shell帮助程序方法sh.stopBalancer()
sh.setBalancerState(false)
还禁用分片群集的自动拆分。要在禁用平衡器时启用自动拆分,您可以使用
sh.enableAutoSplit()
。
mongo
方法sh.enableBalancing(namespace)
和sh.disableBalancing(namespace)
对自动分割没有影响。
mongos
/ mongod
连接池
从MongoDB 4.2开始, MongoDB添加参数ShardingTaskExecutorPoolReplicaSetMatching
。此参数o定mongod
/ mongos
实例到分片集群的每个成员的连接池的最小大小。此值在运行时可能会有所变化。
mongod
mongos
维护与分片集群中每个副本集的辅助副本集的连接池。默认情况下,这些池具有至少与主池的连接数量。
要修改,请参阅ShardingTaskExecutorPoolReplicaSetMatching
。
分片收集和替换文档
从MongoDB 4.2开始,
- 替换文档的操作,例如
replaceOne()
orupdate()
(when used with a replacement 文档),将首先尝试使用 查询筛选器。如果操作无法通过 查询筛选器,然后尝试通过替换来定位 文件。在早期版本中,这些操作仅尝试 使用替换文档的目标。 - 不建议使用
save()
方法:改用insertOne()
或replaceOne()
方法。save()
方法不能与_id
未分片的分片集合一起使用,尝试这样做将导致错误。 - 对于包含
upsert: true
且在分片集合上的替换文档操作,filter
必须在全分片键上包含相等匹配。
安全改进
已解决的常见漏洞和暴露
MongoDB 4.2包含修复程序,可解决以下常见问题 漏洞和风险(CVE):
- CVE-2019-2389(见服务器-40563)
- CVE-2019-2386(见服务器-38984)
新的TLS
选项
MongoDB 4.2为mongod、mongos和mongo shell
添加了TLS
选项,以取代相应的SSL
选项(在4.2中不建议使用)。新的TLS选项提供了与已弃用的SSL
选项相同的功能,因为MongoDB一直支持TLS 1.0及更高版本。
- 对于命令行TLS选项,请参考 mongod, mongos, 和mongo shell页面
- 有关相应的
mongod
和mongos
配置文件选项,请参阅配置文件页面。 - 有关连接字符串
tls
选项,请参阅连接字符串页面。
提示:
大多数新的
TLS
选项名称都与SSL
名称相似;例如--tlsMode
而不是--sslMode
。例外情况是:
net.tls.certificateKeyFile
vs.net.ssl.PEMKeyFile
net.tls.certificateKeyFilePassword
vs.net.ssl.PEMKeyPassword
--tlsCertificateKeyFile
vs.--sslPEMKeyFile
--tlsCertificateKeyFilePassword
vs.--sslPEMKeyPassword
另见:
已弃用的SSL
选项
MongoDB 4.2不推荐使用mongod、mongos和mongo shell的SSL选项以及相应的net.ssl Options配置文件选项。
使用新的TLS改为选项。
新的tls
参数
新参数 | 描述 |
---|---|
tlsWithholdClientCertificate |
适用于 mongod 以及 mongos , 该参数可以被设置为 true 停止实例 发送其 TLS 启动群集内时的证书 与他人的通信 mongod 或 mongos 实例。有关详细信息,请参见 tlsWithholdClientCertificate 。 |
tlsX509ClusterAuthDNOverride |
适用于mongod 和mongos ,该参数可以设置为替代证书DN ,用于x.509会员身份验证。有关详细信息,请参阅tlsX509ClusterAuthDNOverride 。您可以使用此参数滚动更新证书到包含新DN 值的新证书。请参阅包含新DN的x.509集群证书的滚动更新。 |
新的tlsClusterCAFile
选项
MongoDB 4.2为mongod
和mongos
添加了--tlsClusterCAFile
选项/net.tls.clusterCAFile
,该选项指定了一个.pem
文件,用于从建立连接的客户端验证TLS证书。这允许您使用单独的证书颁发机构来验证TLS握手的客户端到服务器和服务器到客户端部分。
另见:
前向保密
从Linux上的4.2版本开始:
- 如果平台的OpenSSL支持椭圆曲线Diffie-Hellman的自动曲线选择,MongoDB支持Ephemeral Elliptic Curve Diffie-Hellman(ECDHE)。
- 如果平台的OpenSSL不支持椭圆曲线Diffie-Hellman的自动曲线选择,MongoDB尝试使用
prime256v1
作为命名曲线启用ECDHE支持。 - 如果启用了对ECDHE的支持,如果没有显式启用Ephemeral Diffie-Hellman(DHE),MongoDB将尝试启用对Ephemeral Diffie-Hellman(DHE)的支持。
在早期版本的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格式与使用文本文件格式的现有单键密钥文件兼容。
新格式允许在不停机的情况下滚动升级按键。请参阅复制集的旋转键和碎片集群的旋转键。
libldap
和libldap_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证书具有以下SANX509v3 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 在弧度中的逆切线(弧切线),其中y 和x 分别是传递给表达式的第一个和第二个值。 |
$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开始,您可以使用聚合管道进行更新:
对于更新,管道可以包括以下几个阶段:
$addFields
及其别名$set
$project
及其别名$unset
$replaceRoot
及其别名$replaceWith
。
使用聚合管道可以进行更具表现力的更新语句,例如根据当前字段值表达条件更新,或使用另一个字段的值更新一个字段。
有关详细信息和示例,请参阅各个参考页面。
另见:
更改流
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开始,您可以使用聚合管道进行更新:
对于更新,管道可以包括以下几个阶段:
$addFields
及其别名$set
$project
及其别名$unset
$replaceRoot
及其别名$replaceWith
。
使用聚合管道可以进行更具表现力的更新语句,例如根据当前字段值表达条件更新,或使用另一个字段的值更新一个字段。
有关详细信息和示例,请参阅各个参考页面。
更新和提
从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
上的通配符索引可以支持userMetadata
、userMetadata.likes
、userMetadata.dislikes
和userMetadata.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或更高版本。 提示:一般来说,使用相应的版本mongodump 和mongorestore 。也就是说,恢复使用特定版本创建的数据文件mongodump ,使用相应的版本mongorestore 。 |
mongoexport |
默认情况下,在扩展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)。
另见:
mongofiles
这个mongofiles
命令get_id
和delete_id
可以接受_id
的ObjectId或非ObjectId值。
mongoimport
和mongorestore
mongoimport
从4.2版本开始:
mongoimport
使用最大批处理大小为100,000来执行批量插入/插入操作。mongoimport
默认情况下,当它遇到重复的密钥和文档验证错误时,请继续。为了确保程序停止这些错误,请指定--stopOnError
。- 指定
--maintainInsertionOrder
mongoimport
:- 使用有序的批量写入操作维护文档插入顺序;即维护批处理中的批处理顺序和文档顺序。在早期版本中,仅维护批处理顺序;批处理中的文档顺序不维护。
- 启用
--stopOnError
,并将numInsertionWorkers
设置为1。
mongorestore
从4.2版本开始:
mongorestore
默认情况下,当它遇到重复的密钥和文档验证错误时,请继续。为了确保程序停止这些错误,请指定--stopOnError
。- 指定
--maintainInsertionOrder
mongorestore
:- 使用有序的批量写入操作维护文档插入顺序;即维护批处理中的批处理顺序和文档顺序。在早期版本中,仅维护批处理顺序;批处理中的文档顺序不维护。
- 启用
--stopOnError
并将--numInsertionWorkersPerCollection
设置为1。
特定DDL操作的锁定优化
从MongoDB 4.2开始,以下操作采用独家收集锁,而不是独家数据库锁:
在MongoDB 4.2之前,这些操作对数据库进行了独家锁定,在操作完成之前阻止数据库及其收集上的所有操作。
在早期版本中,get_id
和delete_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级别。
-
... 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
二级应用程序日志的缓慢操作日志应用程序日志是:
- 不受slowOpSampleRate的影响;即所有缓慢的操作日志条目都由辅助部分记录。
- 不受
logLevel
/systemLog.verbosity
级别(或systemLog.component.replication.verbosity
级别)的影响;即对于oplog条目,辅助日志仅受缓慢的oplog条目的影响。提高详细程度不会记录所有oplog条目。 - 未被分析器捕获,也不受剖析级别的影响。
有关设置慢操作阈值的更多信息,请参阅
mongod --slowms
slowOpThresholdMs
- 从
profile
命令或db.setProfilingLevel()
shell 帮助器方法
从MongoDB 4.2开始,
getLog
命令截断任何包含超过1024个字符的事件。在早期版本中,getLog
512个字符后截断。从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 |
指定报告的操作是否为op 、idleSession 、oridleCursor。 |
$currentOp.cursor |
currentOp.cursor |
指定光标详细信息。返回getmore oridleCursor信息时可用。 |
$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()
包括以下输出更改
副本集状态指标
Starting in version MongoDB 4.2, replSetGetStatus
and its mongo
shell helper rs.status()
return:
副本集成员的IP地址
replSetGetStatus.members[n\].ip
。ISODate格式的日期字符串字段,对应于各种
replSetGetStatus.optimes
。| 新的ISODate格式日期字符串字段 | 相应的 Optime 字段 | | :----------------------------------------------------------- | :----------------------------------------------------------- | |
lastCommittedWallTime
|lastCommittedOpTime
| |readConcernMajorityWallTime
|readConcernMajorityOpTime
| |lastAppliedWallTime
|appliedOpTime
| |lastDurableWallTime
|durableOpTime
|
MongoDB 4.2不建议使用lastStableCheckpointTimestamp
字段。
锁定诊断报告
从4.2版本开始,MongoDB报告ReplicationStateTransition
锁定信息。
此外,MongoDB 4.2将ParallelBatchWriterMode
锁信息与Global
锁信息分开。早期的MongoDB版本将ParallelBatchWriterMode
锁定信息作为Global
锁的一部分。
有关报告锁定信息的操作,请参阅:
serverStatus
命令和db.serverStatus()
方法。$currentOp
聚合管道阶段、currentOp
命令和db.currentOp()
方法。
collStats
改进
从MongoDB 4.2开始,$collStats
聚合、 collStats
命令和mongo
shell helper db.collection.stats()
返回有关索引信息,这些信息 正在建造中。
有关详细信息,请参阅:
collStats.nindexes
collStats.indexDetails
collStats.indexBuilds
collStats.totalIndexSize
collStats.indexSizes
从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”或更高版本的 featureCompatibilityVersion,MongoDB删除了最大127字节的索引名称长度限制。在以前 版本或MongoDB版本featureCompatibilityVersion(fCV)设置为“4.0”,则索引名称必须在
另见:
改进删除索引
删除多个索引
从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
- 块压缩。见
storage.wiredTiger.collectionConfig.blockCompressor
. - 日志压缩。见
storage.wiredTiger.engineConfig.journalCompressor
. - 网络压缩。见
net.compression.compressors
.- 对于使用MongoDB驱动程序的客户端,它们必须使用针对MongoDB 4.2更新的驱动程序。
- mongod和mongos的网络压缩器默认为snappy、zstd和zlib压缩器,按此顺序排列。在4.0版本中,mongod和mongos默认启用网络压缩,snappy作为压缩器。
事务内部的bulkWrite()错误处理
从MongoDB 4.2开始,如果 db.collection.bulkWrite()
操作在事务内部遇到错误,该方法将抛出BulkWriteException(与事务外部相同)。
在4.0中,如果bulkWrite
操作在 事务时,引发的错误不会包装为 批量写入异常
。
在事务内,大容量写入中的第一个错误将导致 整个大容量写入失败并中止事务,即使 批量写入是无序的。
查询计划改进
计划缓存状态
从MongoDB 4.2开始,该高速缓存条目与一个状态相关联:
将状态与条目相关联有助于减少以下情况的可能性 次优高速缓存条目保留在高速缓存中。如需了解更多信息, see Query Plans。
查询哈希
和计划缓存密钥
queryHash
以帮助识别具有相同 查询形状, 从MongoDB 4.2开始,每个 查询形状 关联于 项目a 查询散列。该
queryHash
是一个 一个十六进制字符串,表示查询形状的哈希,并 仅取决于查询形状。与任何散列函数一样,可能会产生两种不同的查询形状 在同一个散列值中。但是,散列的出现 不同查询形状之间的冲突是不可能的。
planCacheKey
为了更深入地了解查询计划缓存,MongoDB4.2引入了planCacheKey。
planCacheKey
是计划缓存条目的键的散列 与该查询相关联。与queryHash不同,planCacheKey是查询形状和形状的当前可用索引的函数。也就是说,如果添加/删除可以支持查询形状的索引,则planCacheKey值可能改变,而queryHash值将不改变。
另见:
该
查询散列
以及计划缓存密钥
提供- 剖析器项目 字段
查询哈希
和planCacheKey
记录的查询操作。 - 诊断日志消息(即mongod/mongos日志 消息)以用于记录的查询操作。
- explain()输出字段:
查询哈希
和计划缓存密钥
- 剖析器项目 字段
这些字段也可用于返回信息的操作 关于查询计划高速缓存:
$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
):
启动警告
内存中存储引擎
从版本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票证的说明 有关项目的资料。
译者:韩鹏帅 参见