MongoDB 3.6的发布说明
安全
默认绑定到Localhost
MongoDB二进制文件,mongod
和mongos
,默认绑定到localhost
。
MONGODB-CR
被弃用
从MongoDB 3.6开始,MONGODB-CR
身份验证机制已被弃用。如果您尚未将MONGODB-CR
身份验证模式升级到SCRAM,请参阅升级到SCRAM。
身份验证限制
为了限制数据库用户连接到指定的IP地址,请在以下内容中添加了authenticationRestrictions
参数:
命令 | 方法 |
---|---|
createUser |
db.createUser() |
updateUser |
db.updateUser() |
createRole |
db.createRole() |
updateRole |
db.updateRole() |
额外的安全增强功能
- 添加了
opensslCipherConfig
参数,以便在使用TLS/SSL加密时控制OpenSSL密码。 - 如果启用了身份验证,您只能针对您创建的光标发布
getMore
。 - 添加了
convertToCapped
操作来restore
角色。
另见:
集合
从MongoDB 3.6开始,提供以下功能。
更具表现力$lookup
$lookup
通过允许在连接集合上进行变量规范和管道执行,增加了对指定多个连接条件以及无关子查询的支持。
有关详细信息,请参阅加入集合上加入条件和子查询的$lookup
语法。
新的聚合阶段
MongoDB 3.6增加了以下新的聚合管道阶段:
运算符号 | 描述 |
---|---|
$currentOp |
返回包含mongod 实例上活动和/或休眠操作信息的文档流。使用新的聚合助手db.aggregate() 。 |
$listSessions |
在config 数据库中列出system.sessions 集合中的服务器会话。使用新的聚合helperdbdb.aggregate() 。 |
$listLocalSessions |
列出服务器缓存在内存中的服务器会话。 |
新的聚合运算符
运算符号 | 描述 |
---|---|
$arrayToObject |
将键值对数组转换为文档。 |
$objectToArray |
将文档转换为表示键值对的文档数组。 |
$mergeObjects |
将多个文档组合成一个文档。 |
$dateFromString |
将日期/时间字符串转换为日期对象。 |
$dateFromParts |
给定日期的组成部分,构造一个BSON Date对象。 |
$dateToParts |
返回包含日期组成部分的文档。 |
新的聚合助手
MongoDB 3.6添加了一个助手db.aggregate()
来执行不依赖基础集合的聚合,例如以$currentOp
或$listLocalSessions
开头的聚合。
新的聚合变量
REMOVE
允许有条件地排除字段。
新选项
aggregate
命令和db.collection.aggregate()
方法支持以下新选项:
hint
指定要使用的索引的选项。笔记:
该
hint
不适用于$lookup
和$graphLookup
阶段。comment
帮助通过数据库分析器、currentOp和日志跟踪操作的选项。
对时区的支持
另见:
数组更新运算符增强
arrayFilters
以下命令和方法可以接受arrayFilters参数,以指定在数组字段中修改哪些元素:
多元素数组更新
MongoDB 3.6添加了以下新的位置运算符,用于数组和嵌套数组的更新操作:
所有位置
$[]
运算符更新数组中的所有元素。过滤的位置
$[identifier]
运算符更新数组中与arrayFilters
标准。
负数组索引位置push
$push
更新运算符的$position
修饰符可以接受负数组索引值,以指示从数组末尾开始的位置。
3.6 兼容驱动程序
以下驱动程序与MongoDB 3.6兼容:
Java 3.6+ | C# 2.5+ | Perl 2.0+ |
Python 3.6+ | Node 3.0+ | PHPC 1.4+ |
C 1.9+ | rubt 2.5+ | Scala 2.2+ |
Go 1.8+ | Rust 2.1+ | C++ 3.6.6+ |
Swift 1.2+ |
DNS构建的种子列表mongodb+srv
除了标准连接格式外,3.6驱动程序还支持DNS构建的种子列表。有关更多信息,请参阅DNS种子列表连接格式。
更改流
MongoDB 3.6支持针对复制集和带有复制集碎片的碎片集群打开更改流。
更改流允许应用程序访问实时数据更改,而无需尾随操作日志的复杂性和风险。应用程序可以使用更改流订阅集合上的所有数据更改,并响应这些更改。
您可以使用thedbdb.collection.watch()
方法从任何3.6系列驱动程序打开更改流。有关使用的完整说明,请参阅首选驱动程序的文档。
重要:
要使用更改流,
featureCompatibilityVersion
必须设置为“3.6”。有关更多信息,请参阅Get FeatureCompatibilityVersion和setFeatureCompatibilityVersion
。
客户会话
因果一致性
为了提供因果一致性,MongoDB 3.6在客户端会话中实现因果一致性。因果一致的客户端会话表示,关联的读取和确认写入操作序列具有因果关系,这反映在其排序上。客户端应用程序必须确保一次只有一个线程在客户端会话中执行这些操作。
应用程序可以启动客户端会话,并将操作与特定会话相关联。应用程序必须确保一次只有一个线程在客户端会话中执行这些操作。
重要:
要使用客户端会话:
- 客户需要MongoDB驱动程序针对MongoDB 3.6进行了更新。
featureCompatibilityVersion
必须是“3.6”。有关更多信息,请参阅Get FeatureCompatibilityVersion和setFeatureCompatibilityVersion
。
可重试写入
重要:
对于可重试写:
- 客户需要MongoDB驱动程序针对MongoDB 3.6进行了更新。
featureCompatibilityVersion
必须是“3.6”。有关更多信息,请参阅Get FeatureCompatibilityVersion和setFeatureCompatibilityVersion
。
从MongoDB 3.6开始,对副本集和分片集群的某些公认写操作是“可重试”的,以处理瞬态网络错误或副本集选择。
通过可重试写入,MongoDB驱动程序在遇到网络错误或遇到副本集故障转移时自动重试这些操作,在此期间副本集没有主服务器。要为3.6驱动程序启用可重试写入,请参阅retryWrites
。
由于重试只尝试一次,因此可重试功能可以帮助解决瞬态网络错误,但不能解决持续的网络错误。
有关可重试写入的更多信息,请参阅可重试写入。
mongo
shell变化
mongoDB 3.6将新的命令行选项--rety Writes添加到mongo shell中。该选项在mongo shell中启用可重试写入。
以下新方法已经添加到mongo shell中的Mongo()连接对象中;
Mongo.isCausalConsistency()
Mongo.startSession()
- Various
Session()
methods - Various
SessionOptions()
methods
服务器会话
MongoDB的服务器会话或逻辑会话是客户会话支持因果一致性和可重试写。
重要:
应用程序使用客户会话与服务器会话接口。
服务器会话可用于独立的mongod
实例、副本集和分片集群。
服务器会话命令
从3.6开始,MongoDB驱动程序将所有操作与服务器会话相关联,但未确认的写入除外。如果部署强制执行身份验证/授权,则服务器会话将与经过身份验证的用户相关联。
以下命令可用于列出、管理和终止整个MongoDB集群的服务器会话:
命令 | 描述包含 |
---|---|
endSessions |
过期指定的服务器会话。 |
killAllSessions |
终止所有服务器会话。 |
killAllSessionsByPattern |
杀死所有与指定模式匹配的服务器会话。 |
killSessions |
终止指定的服务器会话。 |
refreshSessions |
刷新空闲的服务器会话。 |
startSession |
启动新的服务器会话。 |
参数
以下新参数可用于服务器会话:
logicalSessionRefreshMinutes
(在3.6.9中被logicalSessionRefreshMillis
取代)localLogicalSessionTimeoutMinutes
maxAcceptableLogicalClockDriftSecs
聚合阶段
为了支持服务器会话,MongoDB 3.6添加了以下新聚合管道阶段:
运算符号 | 描述 |
---|---|
$listSessions |
在config 数据库中列出system.sessions 集合中的服务器会话。 |
$listLocalSessions |
列出服务器缓存在内存中的服务器会话。使用新的聚合助手db.aggregate() 。 |
一般的
serverStatus
返回有关逻辑SessionRecordCache数量的信息。
命令选项
从3.6开始,MongoDB驱动程序将所有操作与服务器会话相关联,但未确认的写入除外。以下选项适用于所有命令,以支持与服务器会话的关联:
重要:
mongosh
驱动程序将这些选项分配给会话中的命令。
选项 | 类型 | 描述 |
---|---|---|
lsid |
文件 | 指定与命令关联的会话的唯一ID的文档。如果指定了txnNumber ,则需要lsid 。 |
txnNumber |
64位整数 | 一个严格增加的非负数,在命令会话中唯一标识命令。如果指定,该命令还必须包含lsid 。 |
对于delete
、insert
和update
需要一系列语句的命令,还提供以下选项:
重要:
不要手动设置
stmtIds
。MongoDB将stmtIds
设置为严格增加非负数。
选项 | 类型 | 描述 |
---|---|---|
stmtIds |
32位整数数组 | 在写入命令中唯一标识其各自写入操作的数字数组。 |
JSON模式
MongoDB 3.6添加了$jsonSchema
运算符,以支持使用JSON Schema进行文档验证。有关详细信息,请参阅$jsonSchema
。
要使用$jsonSchema
,featureCompatibilityVersion
必须设置为“3.6”。
另见:
向后不兼容的功能
复本集
- 不建议使用副本集协议版本0(
pv0
)。有关副本集协议版本的更多信息,请参阅副本集协议版本。 - 添加了
replSetResizeOplog
命令,以动态调整副本集成员的操作日志大小。适用于运行WiredTiger存储引擎的实例。 - 添加了catchUpTakeoverDelayMillis配置选项,规定了节点在确定其领先于当前初选后等待运行选举的时间。
- 对于使用协议版本1(
pv1
)的副本集,如果仲裁员发现与候选人同等或更大优先权的健康初选,他们将在选举中投反对票。有关副本集协议版本的更多信息,请参阅副本集协议版本。 - 添加了
oplogInitialFindMaxSeconds
参数,以调整副本集的成员在数据同步期间等待其find
命令完成多长时间。 - 添加了
waitForSecondaryBeforeNoopWriteMS
参数,以指定如果afterClusterTime
大于oplog上次应用的时间,辅助必须等待多长时间。 - 添加了对在副本集成员初始同步期间运行以下内容的支持:
renameCollection
convertToCapped
$out
聚合管道中的阶段- 映射减少输出到新集合的工作
分片集群
从3.6开始,碎片必须是复制集。要将您的分片集群升级到3.6版本,碎片服务器必须作为副本集运行。
要将现有的碎片独立实例转换为碎片副本集,请参阅将碎片独立转换为碎片副本集。
从3.6开始,碎片副本集的所有成员,而不仅仅是主副本,都维护有关块元数据的元数据。这防止了次要读取在不使用
"available"
读取关注时返回孤儿数据。添加了
mongos
的ShardingTaskExecutorPoolMaxConnecting
参数,以控制mongos
向mongod
实例添加连接的速度。添加了
orphanCleanupDelaySecs
,在从源碎片中删除迁移的块之前确定最小延迟。config
数据库中的config.system.sessions
集合现在可以分片。
一般增强功能
MongoDB指南针包装
MongoDB Server下载包含特定于平台的安装脚本MongoDB指南针社区版。此脚本安装MongoDB指南针,作为MongoDB服务器安装过程的一部分。
集合标识符
集合具有不可变的唯一标识符。featureCompatibilityVersion
必须设置为"3.6"
另见:
新的查询运算符
MongoDB 3.6添加了以下新的查询运算符:
- 新的
$jsonSchema
运算符匹配验证给定JSON模式的文档。要使用$jsonSchema
,featureCompatibilityVersion
必须设置为“3.6”。 $expr
允许在查询语言中使用聚合表达式。
另见:
删除的操作符
mongoDB 3.6删除已弃用的$pushAll更新操作符。有关详细信息,请参阅 Remove $pushAll
Update Operator.
索引
- 索引可以覆盖嵌套文档中字段的查询。
- 如果索引跟踪哪些字段使其成为多键,多键索引可以覆盖对非数组键的查询。
- 创建索引时,您无法将
*
指定为索引的名称。请参阅名为*
的索引。
命令
- 在
listDatabases
命令中添加了以下选项:nameOnly
仅返回数据库名称(不需要数据库锁),而不是同时返回数据库名称和大小信息(这确实需要数据库锁)。filter
返回与输出上指定匹配条件匹配的数据库。
- 修改了
validate
命令和thedbdb.collection.validate()
方法的行为,使WiredTiger存储引擎仅用于full
验证,强制检查点,将所有内存数据刷新到磁盘,然后验证磁盘上的数据。另见validate
操作。 - 用于
update
和delete
<database>.system.profile
条目包含应用于命名集合的整个更新/删除文档。 dropDatabase
等到数据库中的所有集合都已传播到大多数副本集成员。- 对于在副本集和分片集群上运行的命令,响应文档包括
operationTime
和$clusterTime
。请参阅db.runCommand()
和db.adminCommand()
)。 - 不建议使用的getPrev错误命令。
有线协议和压缩
- MongoDB 3.6引入了一种名为
OP_MSG
的新有线协议操作码。此操作码的消息格式是可扩展的,旨在包含其他操作码的功能。 - MongoDB 3.6 增加了对
zlib
compressor 和--networkMessageCompressors
选项的支持 (如果使用配置文件,则为net.compression.compressors
设置).--networkMessageCompressors
选项(或net.compression.compressors
设置) 允许在mongod
,mongos
,mongo
shell, 和支持OP_COMPRESSED
消息格式的驱动程序之间进行网络压缩。 mongod
mongos
默认启用网络压缩,以snappy
为压缩机。有关网络压缩的更多信息,请参阅net.compression.compressors
。
阅读关注
新的
"available"
阅读关注问题可用。对于未分片集合(包括独立部署或副本集部署中的集合),"local"
和"available"
阅读问题的行为相同。对于分片集群,"available"
对分区提供了更大的容忍度,但如果碎片正在进行块迁移,则可能会返回孤单据文档。另见:
从MongoDB 3.6开始,MongoDB支持"多数"默认情况下读取关注。
对于MongoDB 3.6.1 - 3.6.x,您可以禁用读取关注"多数"防止存储缓存压力使用主-次级仲裁器(PSA)架构固定部署。致残"多数"阅读关注也会禁用对更改流
有关更多信息,请参阅禁用阅读关注多数。
FTDC
MongoDB 3.6增加了对mongos
诊断捕获(也称为FTDC
)的支持。[1]在以前的版本中,该功能仅适用于mongod
。请参阅诊断参数。
笔记:
默认情况下启用FTDC。
MongoDB 3.4.14+还增加了mongos
对FTDC的支持。
其他增强功能
MongoDB 3.6包括以下增强功能:
- 添加了对使用
--bind_ip
指定完整的Unix域套接字路径的支持。 mongod
现在提供了一个--timeZoneInfo
选项。使用此选项指定系统时区数据库的路径。Linux和macOS软件包中包含的默认配置文件将其设置为/usr/share/zoneinfo
。- 日期操作现在在所有受支持的操作系统中接受一致的日期范围。您可以安全地在
0
到9999
之间工作。 mongod
的新honorSystemUmask
启动选项导致MongoDB创建的新文件具有由乌马斯克运行mongod
进程的用户。仅适用于Linux和macOS系统。- 数据库的maxWriteBatchSize限制,表示写入批次中允许的最大写入操作数量,从
1,000
增加到100,000
。 planCacheListPlans
数据库命令生成与PlanCache.getPlansByQuery()
shell 方法相同的输出。 这两个操作的输出现在都包含了生成计划的时间戳。- 新的
KeysRotationIntervalSec
服务器参数指定了HMAC签名密钥在旋转到下一个之前是有效的。 find
命令的选项oplogReplay
现在支持$eq
运算符。
影响兼容性的变化
一些更改可能会影响兼容性,可能需要用户采取行动。有关兼容性更改的详细列表,请参阅MongoDB 3.6中的兼容性更改。
升级程序
重要:
功能兼容性版本3.4
要升级,3.4实例必须将
featureCompatibilityVersion
设置为3.4。要检查版本:db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
有关验证和设置
featureCompatibilityVersion
的具体详细信息,以及有关升级的其他先决条件/考虑的信息,请参阅单独的升级说明:
如果您需要升级到3.6的指导,MongoDB提供主要版本升级服务帮助确保顺利过渡到您的MongoDB应用程序而不中断。
下载
要下载MongoDB 3.6,请转到MongoDB下载中心
另见:
3.6.3中的已知问题
-
MongoDB 3.6没有在macOS 10.13中的新文件系统APFS上进行测试,可能会遇到错误。
构建内存结构的操作因果一致;然而,只有一些操作在与因果一致会话相关联时返回错误。请参阅因果一致性限制。
3.6.2中的已知问题
-
MongoDB 3.6没有在macOS 10.13中的新文件系统APFS上进行测试,可能会遇到错误。
构建内存结构的操作因果一致;然而,只有一些操作在与因果一致会话相关联时返回错误。请参阅因果一致性限制。
3.6.1中的已知问题
-
MongoDB 3.6没有在macOS 10.13中的新文件系统APFS上进行测试,可能会遇到错误。
构建内存结构的操作因果一致;然而,只有一些操作在与因果一致会话相关联时返回错误。请参阅因果一致性限制。
3.6.0中的已知问题
-
当将URI与SRV一起使用时,如果命令行URI中没有指定查询参数,则获取的TXT记录将被忽略。要绕过这一点,请在URI查询字符串中显式指定用于与数据库通信的TLS/SSL设置(ssl=true或ssl=false)。
-
MongoDB 3.6没有在macOS 10.13中的新文件系统APFS上进行测试,可能会遇到错误。
构建内存结构的操作因果一致;然而,只有一些操作在与因果一致会话相关联时返回错误。请参阅因果一致性限制。
另见:
报告问题
要报告问题,请参阅https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports关于如何为MongoDB服务器或相关项目之一提交JIRA票据的指导。
译者:韩鹏帅 参见