MongoDB 3.2 版本说明(Release Notes for MongoDB 3.2)
英文原文:
https://docs.mongodb.org/master/release-notes/3.2/
2015年12月8日
MongoDB 3.2现在发布了。关键特性是将WiredTiger作为默认存储引擎,复制选举增强,集群中的config servers配置为复制集,readConcern,和文档验证。
OpsManager 2.0也发布了。查看Ops Manager文档和Ops Manager版本说明获取更多信息。
小版本发布(Minor Releases)
3.2.1 �C 2016年1月12日
修复了错误:当复制集执行常规关闭,辅助副本成员可能会将特定已复制但还没有应用的操作标记为已成功应用:SERVER-21868
在Windows版本使用WiredTiger提高insert负载性能:SERVER-20262
修复了块移动期间长时间运行的事务:SERVER-21366
所有在3.2.1版本中关闭的问题
WiredTiger作为默认引擎(WiredTiger as Default)
从3.2版开始,MongoDB使用WiredTiger作为默认的存储引擎。
为了指定MMAPv1存储引擎,你必须以下面任一方式指定存储设置:
在命令行使用--storageEngine选项:
mongod --storageEngine mmapv1
或者在配置文件中,使用storage.engine设置:
storage: engine: mmapv1
注意:
对于已经存在的部署,如果你不指定--storageEngine或者storage.engine设置,MongoDB 3.2可以自动决定用于在--dbpath或storage.dbPath中创建数据文件的存储引擎。
如果指定--storageEngine或者storage.engine,如果dbPath包含不是指定的存储引擎创建的数据文件mongod将不会启动。
也可以参考:
Default Storage Engine Change
复制选举增强(Replication Election Enhancements)
从MongoDB 3.2起,MongoDB减少了复制集故障切换时间,并加速了多个同时存在的主成员的监测。
作为增强的部分,MongoDB引入了第一版复制集协议。新的复制集将会默认使用protocolVersion: 1。之前版本的MongoDB使用该协议的版本0。
此外,MongoDB使用了新的replica set configuration选项electionTimeoutMillis。
electionTimeoutMillis以毫秒指定了用于检测当一个复制集的主成员不可达时的时间限制。
electionTimeoutMillis只应用在使用replication protocol版本1时。
分片集群增强(Sharded Cluster Enhancements)
MongoDB 3.2对于配置服务器(config servers)放弃使用三个镜像mongod实例。
而是,从3.2开始,分片集群的config servers可以部署为一个复制集。复制集config servers必须运行WiredTiger存储引擎。
这个改变提高了访问config servers的一致性,因为对于分片配置数据,MongoDB可以利用标准复制集读写协议。此外,这允许一个分片集群有多于3个config servers因为一个复制集可以多达50个成员。
对于更多信息,查看Config Servers。为了使用复制集config servers部署一个新的分片集群,查看Deploy a Sharded Cluster。
readConcern
MongoDB 3.2针对复制集和复制集分片引入了readConcern查询选项。对于WiredTiger storage engine,readConcern选项允许客户端对于它们的读请求选择一个隔离级别。你可以指定一个“majority”的readConcern来读取已经写入大多数节点的数据并且不能被回滚。默认,MongoDB使用一个“local”的readConcern返回当前的可用数据给查询时刻的节点,即使数据还没有被持久化到大多数节点并可能被回滚。使用MMAPv1 storage engine,你可能只指定一个“local”的readConcern。
readConcern需要针对MongoDB 3.2版本的MongoDB驱动更新。
只有使用protocol version 1的复制集支持“majority”读确认(read concern)。运行版本0协议的复制集不支持“majority”读确认。
对于更多关于readConcern,包括支持该选项的操作,查看Read Concern。
部分索引(Partial Indexes)
MongoDB 3.2提供了选项用于创建只索引匹配指定过滤表达式的文档的索引。通过索引集合中文档的子集,部分索引有更低的存储需求并且对于索引创建和维护降低了性能消耗。你可以指定一个partialFilterExpression选项对于所有的MongoDB index types。
partialFilterExpression选项接受一个文档作为指定条件,通过使用:
等值表达式(例如,field: value或使用$eq操作符),
$exists: true表达式,
$gt,$gte,$lt,$lte表达式,
$type表达式,
$and操作符只在最顶层
对于详细信息,查看Partial Indexes。
文档验证(Document Validation)
从3.2开始,MongoDB提供了在更新和插入期间验证文档的能力。验证规则基于每个集合指定。
为了在一个新的集合上指定文档验证,在db.createCollection()方法使用新的validator选项。为了添加文档验证到一个存在的集合,在collMod命令使用新的validator选项。对于更多信息,查看Document Validation。
为了查看一个集合的验证规则,使用db.getCollectionInfos()方法。
下面的命令可以使用新的bypassDocumentValidation选项避开验证每个操作:
applyOps命令
findAndModify命令和db.collection.findAndModify()方法
mapReduce命令和db.collection.mapReduce()方法
insert命令
update命令
$out对于aggregate命令和db.collection.aggregate()方法
对于已经启用访问控制的部署,你必需有bypassDocumentValidation行为。内置角色dbAdmin和restore提供该行为。
聚合框架增强(Aggregation Framework Enhancements)
MongoDB引入:
新的阶段,累加器和表达式。
Availability of accumulator expressions在$project阶段。
Performance improvements在分片集群。
新的聚合阶段
阶段 |
描述 |
语法 |
$sample |
随机从输入选择N条文档 |
{ $sample: { size: <positive integer> } } |
$indexStats |
返回关于索引使用的统计 |
{ $indexStats: { } } |
$lookup |
与另一个集合执行left outer join关联 |
{ $lookup: { from: <collection to join>, localField: <fieldA>, foreignField: <fieldB>, as: <output array field> } } |
对$group阶段新的累加器
累加器 |
描述 |
语法 |
$stdDevSamp |
累加标准偏差 |
{ $stdDevSamp: <array> } |
$stdDevPop |
累加流行标准偏差 |
{ $stdDevPop: <array> } |
新的聚合算术运算操作
操作 |
描述 |
语法 |
$sqrt |
计算平方根 |
{ $sqrt: <number> } |
$abs |
返回数字的绝对值 |
{ $abs: <number> } |
$log |
以指定基数计算数字的对数 |
{ $log: [ <number>, <base> ] } |
$log10 |
计算以10为底数的对数 |
{ $log10: <number> } |
$ln |
计算数字的自然对数 |
{ $ln: <number> } |
$pow |
计算数字的指定指数的幂 |
{ $pow: [ <number>, <exponent> ] } |
$exp |
计算指数为e的幂 |
{ exp: <number> } |
$trunc |
截断数字为整数 |
{ $trunc: <number> } |
$ceil |
返回大于或等于指定数字的最小整数 |
{ $ceil: <number> } |
$floor |
返回小鱼或等于指定数字的最大整数 |
{ floor: <number> } |
新的聚合数组操作
操作 |
描述 |
语法 |
$slice |
返回数组的子集 |
{ $slice: [ <array>, <n> ] } or { $slice: [ <array>, <position>, <n> ] } |
$arrayElemAt |
返回指定数组索引位置的元素 |
{ $arrayElemAt: [ <array>, <idx> ] } |
$concatArrays |
连接数组 |
{ $concatArrays: [ <array1>, <array2>, ... ] } |
$isArray |
判断运算对象是否为数组 |
{ $isArray: [ <expression> ] } |
$filter |
查询基于条件的数组的子集 |
{ $filter: { input: <array>, as: <string>, cond: <expression> } } |
累加器表达式可用性(Accumulator Expression Availability)
从3.2版开始,以下累加器表达式,之前只在$group阶段可用,现在在$project阶段也可用了:
$avg
$min
$max
$sum
$stdDevPop
$stdDevSamp
当用于$project阶段时,这些累加器表达式可以接受:
单一参数:<accumulator> : <arg>
多个参数:<accumulator> : [ <arg1>, <arg2>, ... ]
一般增强(General Enhancements)
在MongoDB 3.2中,$project阶段支持使用方括号[]直接创建新的数组列。例如,查看Project New Array Fields。
MongoDB 3.2对$geoNear阶段引入minDistance选项。
$unwind阶段不再对非数组操作数报错。如果操作数不解析为数组但不缺失,为null或者一个空数组,$unwind认为操作数为单一元素数组。
$unwind阶段可以:
通过在阶段规则中指定一个新的选项includeArrayIndex在输出中包含数组元素的索引。
通过在阶段规则中指定一个新的选项preserveNullAndEmptyArrays输出这些数组列缺失,null或者一个空数组的文档。
为了支持这些新特性,$unwind现在可以采用另一种语法,查看$unwind详细信息。
优化(Optimization)
索引可以覆盖聚合操作。
MongoDB提高了在大的分片集群的管道的整体性能。
如果管道以对片键的精确$match开始,整个管道只运行在匹配的分片上。之前,管道会被拆分,合并的操作将会在主分片上执行。
对于运行在多个分片上的聚合操作,如果操作不需要运行在数据库的主分片上,这些操作可以路由结果到任何分片来合并结果,避免数据库的主分片过载。需要运行在数据库的主分片上的聚合操作是$out阶段和$lookup阶段。
兼容性(Compatibility)
对于兼容性改变,查看Aggregation Compatibility Changes。
MongoDB工具增强(MongoDB Tools Enhancements)
mongodump和mongorestore使用新的--archive选项添加对归档文件和标准输出/输入流的支持。该增强允许通过网络设备基于管道导出的数据流。例如,查看
mongodump to an Archive File和mongodump an Archive to Standard Output
Restore a Database from an Archive File和Restore a Database from Standard Input。
mongodump和mongorestore使用新的--gzip选项添加对压缩数据导出的支持。该增强减少了对导出文件的存储空间。例如,查看:
Compress mongodump Output
Restore from Compressed Data。
加密存储引擎(Encrypted Storage Engine)
企业版特性:
可在MongoDB企业版可用。
重要:
只对WiredTiger存储引擎可用。
安静加密,当联合使用透明加密和好的保护相关帐号、密码和加密密钥的安全策略,可以帮助确保遵守安全和私有标准,包括HIPAA、PCI-DSS和FERPA。
MongoDB企业版3.2对WiredTiger存储引擎引入了一个本地加密选项。这个特性允许MongoDB加密数据文件以致只有有解密密钥的当事人可以解码和读取数据。更多详细信息,查看Encrypted Storage Engine。
文本搜索增强(Text Search Enhancements)
文本索引版本3(text Index Version 3)
MongoDB 3.2引入了text index的版本3。索引的新版本的关键特性是:
提高了case insensitivity。
Diacritic insensitivity。
额外的delimiters for tokenization。
从MongoDB 3.2开始,版本3对于新的text索引为默认版本。
也可以查看:
Text Index Version 3 Compatibility
$text操作符增强($text Operator Enhancements)
$text操作符增加对如下支持:
case sensitive text search带有新的$caseSensitive选项,和
diacritic sensitive text search带有新的$diacriticSensitive选项。
对于更多信息和示例,查看$text操作符相关部分Case Insensitivity和Diacritic Insensitivity。
其他语言支持(Support for Additional Languages)
企业版特性:
只在MongoDB企业版可用。
从3.2版开始,MongoDB企业版提供了对以下语言的支持:Arabic,Farsi(尤其Dari和Iranian Persian方言),Urdu,简体中文和繁体中文。
详细信息,查看Text Search with Basis Technology Rosette Linguistics Platform。
新的存储引擎
inMemory存储引擎
企业版特性:
只在MongoDB企业版可用。
MongoDB企业版3.2提供了一个内存中的存储引擎。除了一些元数据,内存中存储引擎不维护任何磁盘数据。通过避免磁盘I/O,内存中的存储引擎允许更可预见的数据库操作延时。
警告:
当前处于beta阶段。不能在产品中使用。
为了选择这个存储引擎,指定
inMemory对于--storageEngine选项或者storage.engine设置。
--dbpath。尽管内存中处理引擎不写数据到文件系统,它维护在--dbpath小元数据文件和诊断数据以及构建大索引的临时文件。
inMemory存储引擎使用文档级别锁。对于更多细节,查看In-Memory Storage Engine。
ephemeralForTest存储引擎(ephemeralForTest Storage Engine)
MongoDB 3.2提供了一个新的用于测试的存储引擎。而不是一些元数据,用于测试的存储引擎不维护任何磁盘数据,不需要在测试运行期间做清理。用于测试的存储引擎是无支持的。
警告:
只对测试目的。不能在产品中使用。
为了选择这个存储引擎,指定
ephemeralForTest对于--storageEngine选项或者storage.engine设置。
--dbpath。尽管用于测试的存储引擎不写数据到文件系统,它在--dbpath中维护小的元数据文件。
ephemeralForTest存储引擎使用集合级别的锁。
一般增强(General Enhancements)
位测试查询操作符(Bit Test Query Operators)
MongoDB 3.2提供了新的查询操作符用于测试位值:
$bitsAllSet
$bitsAllClear
$bitsAnySet
$bitsAnyClear
SpiderMonkey JavaScript引擎(SpiderMonkey JavaScript Engine)
MongoDB 3.2对于mongo shell和mongod server使用SpiderMonkey作为JavaScript引擎。
SpiderMonkey提供了对其他平台的支持并且有一个提高的内存管理模型。
这个改变影响了所有的JavaScript行为包括命令mapReduce,group,和查询操作符$where;然而,这个改变应该是对用户完全透明的。
也可以查看:
SpiderMonkey Compatibility Changes
mongo Shell和CRUD API(mongo Shell and CRUD API)
为了提供和MongoDB驱动的CRUD(Create/Read/Update/Delete)API的一致性,mongo shell引入了其他CRUD方法与驱动的CRUD API保持一致:
新的API |
描述 |
db.collection.bulkWrite() |
等价于初始化Bulk()操作构造器,使用Bulk方法来添加操作和运行Bulk.execute()来执行操作。 MongoDB 3.2放弃了Bulk()和它的相关方法。 |
db.collection.deleteMany() |
等价于db.collection.remove()。 |
db.collection.deleteOne() |
等价于db.collection.remove()带有justOne设置为true;例如: db.collection.remove( <query>, true ) 或 db.collection.remove( <query>, { justOne: true } )。 |
db.collection.findOneAndDelete() |
等价于db.collection.findAndModify()方法带有remove设置为true。 |
db.collection.findOneAndReplace() |
等价于db.collection.findAndModify()方法带有update设置为一个替代文档。 |
db.collection.findOneAndUpdate() |
等价于db.collection.findAndzModify()方法带有update设置为一个使用update操作符指定修改的文档。 |
db.collection.insertMany() |
等价于db.collection.insert()方法带有一个文档数组作为参数。 |
db.collection.insertOne() |
等价于db.collection.insert()方法带有一个文档作为参数。 |
db.collection.replaceOne() |
等价于db.collection.update( <query>, <update> )方法带有一个替换文档作为<update>参数。 |
db.collection.updateMany() |
等价于db.collection.update( <query>, <update>, { multi: true, ... })方法带有使用update操作符和multi选项设置为true的指定修改的<update>文档。 |
db.collection.updateOne() |
等价于db.collection.update( <query>, <update> )方法带有使用update操作符指定修改的一个<update>文档。 |
WiredTiger和fsyncLock(WiredTiger and fsyncLock)
从MongoDB 3.2开始,WiredTiger存储引擎支持带有lock选项的fsync命令或者mongo shell方法db.fsyncLock()。那就是,对于WiredTiger存储引擎,这些操作可以保证数据文件不改变,确保创建备份一致性的目的。
放弃32位二进制文件(Deprecation of 32-bit Binaries)
从3.2版开始,32位二进制被放弃并且在将来的版本中不可用。
$type操作符接受字符串别名($type Operator Accepts String Aliases)
$type操作符对于BSON类型,除了与BSON类型相关的数字外,接受字符串别名。
explain()支持distinct()操作(explain() Support for distinct() Operation)
db.collection.explain()添加了对db.collection.distinct()方法的支持。对于更多信息,查看db.collection.explain()。
放弃HTTP界面(Deprecation of the HTTP Interface)
从3.2版开始,MongoDB放弃了它的HTTP界面。
地理空间优化(Geospatial Optimization)
MongoDB 3.2引入了2dsphere indexes版本3,在更精细的层次索引GeoJSON geometries。新版在更小的区域提高了2dsphere index查询的性能。此外,对于2d indexes和2dsphere indexes,geoNear查询的性能对于密集数据集已经提高。
也可以查看:
2dsphere Index Version 3 Compatibility
诊断数据捕获(Diagnostic Data Capture)
为了让MongoDB工程师促进MongoDB服务器行为的分析,MongoDB 3.2引入了诊断数据收集架构,以一定的时间间隔写服务器统计信息到诊断文件。默认,该架构以1秒的间隔捕获数据。为了修改该间隔,查看diagnosticDataCollectionPeriodMillis。
MongoDB在mongod实例--dbpath或storage.dbPath下创建了一个diagnostic.data目录。诊断数据在目录下存储为文件。
诊断文件的最大大小使用diagnosticDataCollectionFileSizeMB配置,并且diagnostic.data目录的最大大小使用diagnosticDataCollectionDirectorySizeMB配置。
对于捕获间隔的默认值和最大大小被作为有用的数据提供给MongoDB工程师,对性能和存储大小有最小影响。典型地,这些值只需要被MongoDB工程师为特定的诊断目的的请求而修改。
写确认(Write Concern)
对于复制集使用protocolVersion: 1,辅助副本成员在写入它们各自的磁盘journals后确认写操作,忽略j选项。
对于复制集使用protocolVersdion: 1,w: “majority”意味着j: true。
使用j: true,MongoDB只会在请求数量的成员,包括主成员,已经写入journal后返回。之前j: true在复制集中的写确认只需要主成员写入journal,忽略了w: <value>写确认。
WiredTiger引擎的journalCommitInterval(journalCommitInterval for WiredTiger)
MongoDB 3.2对于WiredTiger存储引擎增加了对指定journal提交间隔的支持。查看journalCommitInterval选项。在之前的版本中,选项只应用于MMAPv1存储引擎。
对于相关的配置文件设置,MongoDB 3.2增加了storage.journal.commitIntervalMs设置和放弃了storage.mmapv1.journal.commitIntervalMs。放弃的storage.mmapv1.journal.commitIntervalMs设置作为对storage.journal.commitIntervalMs设置的别名。
影响兼容性的改变(Changes Affecting Compatibility)
一些MongoDB 3.2的改变可能影响兼容性并且可能需要用户行动。对于详细的兼容性改变的列表,查看Compatibility Changes in MongoDB 3.2。
升级过程(Upgrade Process)
查看Upgrade MongoDB to 3.2获取完整的升级指南。
在3.2.1中的已知问题(Known Issues in 3.2.1)
在3.2.1版本中已知问题的列表:
当节点间的时钟漂移大于electionTimeOut,客户端可能发现新的主节点失败:SERVER-21744。
fromMigrate标记不会在oplog中设置用于删除:SERVER-21678
在一个3.2版mongo shell连接到一个3.0版mongos或者在一个3.0版mongo shell连接到一个3.0版mongos带有read preference运行explain,带有3.2版本的分片是不兼容的:SERVER-21661
connPoolStats命令的结果不再正确:SERVER-21597
ApplyOps后端索引创建可能会死锁:SERVER-21583
对于protocolVersion 1的复制集使用w:majority写的性能回归:SERVER-21581
UNICODE感知文本处理逻辑(文本索引第3版)的性能回归:SERVER-19936
在3.2.0中的已知问题(Known Issues in 3.2.0)
在3.2.0版本中已知问题的列表:
findAndModify操作不会被profiler捕获:SERVER-21772
getMore命令不会设置“nreturned”操作计数器:SERVER-21750
当节点间的时钟漂移大于electionTimeout,客户端可能发现新的主节点失败:SERVER-21744
fromMigrate标记不会在oplog中设置用于删除:SERVER-21678
在一个3.2版mongo shell连接到一个3.0版mongos或者在一个3.0版mongo shell连接到一个3.0版mongos带有read preference运行explain,带有3.2版本的分片是不兼容的:SERVER-21661
connPoolStats命令的结果不再正确:SERVER-21597
ApplyOps后端索引创建可能会死锁:SERVER-21583
对于protocolVersion 1的复制集使用w:majority写的性能回归:SERVER-21581
UNICODE感知文本处理逻辑(文本索引第3版)的性能回归:SERVER-19936
在Windows下的WiredTiger引擎的插入工作负载中服务器性能回归:SERVER-21792
下载(Download)
下载MongoDB 3.2,去到downloads page。
也可以查看:
All Third Party License Notices.
All JIRA issues resolved in 3.2.
其他资源(Additional Resources)
Get ready for MongoDB 3.2?Get our help.