MongoDB 2.2是生产版本系列,是2.0生产版本系列的后续版本。
MongoDB 2.0数据文件与2.2系列二进制文件兼容,无需任何特殊的迁移过程。但是,请始终使用以下过程对副本集和分片群集执行升级过程。
mongod
,2.2是2.0和1.8的直接替代。
检查驱动程序文档以获取有关所需兼容性升级的信息,并始终运行驱动程序的最新版本。
通常,只有运行身份验证的用户才需要升级驱动程序,然后才能继续升级到2.2。
对于所有使用身份验证的部署,请在升级一个mongod
或多个实例之前先升级驱动程序(即客户端库)
。
对于分片群集的所有升级:
除上述限制外,2.2进程可以与2.0和1.8工具和进程互操作。在部署可以正常运行的同时,您可以安全地逐一升级
部署mongod
和mongos
组件。在升级生产系统之前,请务必阅读以下详细的升级步骤。[1]
[1] | 为了最大程度地减少选举过程造成的中断
,请始终先升级集合的辅助数据库,然后再升级主数据库,然后再升级主数据库。step down |
mongod
¶mongod
实例。将现有二进制文件替换为2.2 mongod
二进制文件,然后重新启动MongoDB。您可以通过单独升级成员来执行集合的“滚动”升级,从而升级到2.2,而其他成员则可以最大程度地减少停机时间。使用以下过程:
通过关闭并一次将2.0二进制文件替换为2.2二进制文件,一次升级集合的第二个成员mongod
。升级mongod
实例后,请等待成员恢复到SECONDARY
状态,然后再升级下一个实例。要检查成员的状态,请rs.status()
在
mongo
shell中发出。
使用mongo
shell方法rs.stepDown()
降级主要数据库,以允许常规故障转移过程。 rs.stepDown()
加快故障转移过程,并且比直接关闭主数据库更可取。
一旦主节点降级并且另一个成员进入
PRIMARY
状态,如在输出中观察到的
rs.status()
,请关闭先前的主节点,并用mongod
2.2二进制文件替换
二进制文件并启动新进程。
注意
副本集故障转移不是即时的,但是将使该集不可用于读取或接受写入,直到故障转移过程完成为止。通常,这需要10秒钟或更长时间。您可能希望在预定义的维护时段内计划升级。
聚合框架使无需使用map-reduce即可进行聚合操作。该
aggregate
命令公开了聚合框架,并且外壳程序中的
aggregate()
帮助mongo
程序为这些操作提供了接口。考虑以下资源,以了解聚合框架及其用法:
TTL集合使用特殊索引和后台线程从集合中删除过期数据,该后台线程每分钟删除一次过期文档。在某些情况下,例如在数据仓库和缓存情况下,这些集合可用于替代 上限集合,包括:机器生成的事件数据,日志和会话信息,它们仅需要在有限的时间段内保留。
有关更多信息,请参见通过设置TTL从集合中过期数据教程。
MongoDB 2.2通过以下改进增加了服务器的并发操作能力:
为了反映这些更改,MongoDB现在提供了更改和改进的并发和使用报告。见锁,recordStats,db.currentOp()
,
mongotop和mongostat。
MongoDB 2.2添加了对地理分布或集群中分片集合的其他自定义分区的附加支持。通过使用这种“标记感知”分片,您可以自动确保分片数据库系统中的数据始终位于特定分片上。例如,使用标记感知分片,可以确保数据与最经常使用该数据的应用程序服务器最接近。
碎片标记控制数据位置,并且与副本集标记互补,但与副本集标记分开,副本集标记控制读取首选项和写关注。例如,分片标记可以将所有“美国”数据固定到一个或多个逻辑分片,而副本集标记可以控制应用程序使用哪些mongod
实例(例如“ production
”或“ reporting
”)来服务请求。
请参阅mongo
外壳中支持标记分片配置的以下帮助程序的文档:
findAndModify
返回执行插入的Upserts的Null值¶在2.2版中,对于将选项设置为的执行插入的
upsert,命令现在将返回以下输出:new
false
findAndModify
在mongo
Shell中,findAndModify
执行插入(new
设置为false
。)的upsert 操作仅输出一个null
值。
在2.0版中,这些操作将返回一个空文档,例如。{ }
有关更多信息,请参见:SERVER-6226。
mongodump
2.2输出与2.2之前的版本不兼容mongorestore
¶如果使用mongodump
2.2发行版中的工具创建数据库转储,则必须使用2.2(或更高版本)的
mongorestore
还原该转储。
有关更多信息,请参见:SERVER-6961。
ObjectId().toString()
返回字符串文字ObjectId("...")
¶在版本2.2中,该toString()
方法返回ObjectId()
对象的字符串表示形式,其格式为ObjectId("...")
。
考虑以下示例,该示例toString()
在ObjectId("507c7f79bcf86cd7994f6c0e")
对象上调用
方法
:
该方法现在返回字符串
ObjectId("507c7f79bcf86cd7994f6c0e")
。
以前,在2.0版中,该方法将返回十六进制string 507c7f79bcf86cd7994f6c0e
。
如果需要2.0和2.2版本之间的兼容性,请使用 ObjectId()。str,它在两个版本中都包含十六进制字符串值。
ObjectId().valueOf()
返回十六进制字符串¶在版本2.2中,该valueOf()
方法以小写十六进制字符串形式返回ObjectId()对象的值。
考虑以下示例,该示例valueOf()
在ObjectId("507c7f79bcf86cd7994f6c0e")
对象上调用方法
:
现在,该方法返回十六进制字符串
507c7f79bcf86cd7994f6c0e
。
以前,在2.0版中,该方法将返回object
ObjectId("507c7f79bcf86cd7994f6c0e")
。
如果需要版本2.0和2.2之间的兼容性,请使用 ObjectId()。str属性,该属性在两个版本中都包含十六进制字符串值。
在版本2.2中,集合名称不能:
$
。""
)。此更改不会影响在早期版本的MongoDB中使用非法名称创建的集合。
这些新限制是对集合名称的现有限制的补充:
system.
前缀开头。MongoDB system.
为系统集合(例如集合)
保留system.indexes
。集合名称可以具有任何其他有效的UTF-8字符串。
请参阅SERVER-4442和“ 命名限制”常见问题。
Windows上运行的数据库名称不能再包含以下字符:
数据文件的名称包括数据库名称。如果您尝试使用一个或多个这些字符升级数据库实例,
mongod
将拒绝启动。
升级之前,请更改这些数据库的名称。有关更多信息,请参见 SERVER-4584和SERVER-6729。
_id
上限集合的字段和索引¶如果所有有上限的集合存在于数据库外部_id
,则默认情况下现在都有一个域local
,并且现在在该_id
域上具有索引。此更改仅影响使用2.2实例创建的上限集合,而不会影响现有的上限集合。
有关更多信息,请参见:SERVER-5516。
$elemMatch
投影算子¶该$elemMatch
运算符允许应用程序缩小从查询返回的数据的范围,以便查询操作将仅返回数组中的第一个匹配元素。有关更多信息,请参见
$elemMatch
参考以及
SERVER-2238和SERVER-828问题。
从2.2开始,MongoDB不支持Windows XP。请升级到Windows的最新版本,以使用最新版本的MongoDB。有关更多信息,请参见SERVER-5648。
mongos.exe
¶您现在可以将mongos.exe
实例作为Windows服务运行。有关更多信息,请参阅mongos.exe
参考和
作为Windows服务启动MongoDB社区版和SERVER-1589。
Windows版MongoDB现在通过logRotate
数据库命令支持日志轮换
。有关更多信息,请参见SERVER-2612。
在下载页面上标记为“ 2008+”的此版本针对Windows Server 2008 R2的64位版本以及Windows 7或更高版本提供了比MongoDB的标准64位Windows版本更高的性能。有关更多信息,请参见SERVER-3844。
mongodump
和mongorestore
¶当您将--collection
选项指定为时mongodump
,mongodump
现在将备份源数据库上存在的所有索引的定义。当您尝试使用还原此备份时
mongorestore
,目标mongod
将重建所有索引。有关更多信息,请参见SERVER-808。
mongorestore
现在包括--noIndexRestore
提供上述行为的选项。使用--noIndexRestore
以防止mongorestore
从建筑以前索引。
mongooplog
重播Oplogs ¶该mongooplog
工具可以
从实例中提取oplog条目mongod
并将其应用于另一个
mongod
实例。您可以mongooplog
用来实现MongoDB数据集的时间点备份。请参阅
SERVER-3873案例和mongooplog
参考。
mongotop
和mongostat
¶mongotop
并且mongostat
现在包含对用户名/密码身份验证的支持。有关此更改的更多信息,请参见SERVER-3875和
SERVER-3871。另请考虑以下选项的文档以获取更多信息:
mongoimport
和mongorestore
¶mongoimport
现在,如果操作遇到错误(例如,网络中断,重复的密钥异常或写入错误),则可以选择暂停导入。该--stopOnError
选项将产生错误,而不是静默继续导入数据。有关更多信息,请参见
SERVER-3937。
在中mongorestore
,该--w
选项提供对可配置写关注的支持。
mongodump
支持从中学阅读¶现在mongodump
,连接到副本集的
辅助成员后即可运行。有关更多信息,请参见
SERVER-3854。
mongoimport
支持完整的16MB文档¶以前,mongoimport
只会导入小于4兆字节的文档。现在,此问题已得到纠正,您可以mongoimport
用来导入ins大小至少为16 MB的文档。有关更多信息,请参见SERVER-4593。
Timestamp()
扩展JSON格式¶MongoDB扩展的JSON现在包括一个新Timestamp()
类型,用于表示MongoDB 在其他上下文中用于oplog中时间戳的Timestamp类型
。
这允许像mongooplog
和mongodump
查询类似的工具来查询特定的时间戳。请考虑以下
mongodump
操作:
有关更多信息,请参见SERVER-3483。
2.2包含许多更改,这些更改提高了mongo
外壳程序用户界面的整体质量和一致性:
edit
命令的支持。有关更多信息,请参见SERVER-3998。将db.loadServerScripts()
当前数据库system.js
集合的内容加载到当前mongo
Shell会话中。有关更多信息,请参见SERVER-1651。
如果将文档数组传递给该
insert()
方法,则mongo
Shell现在将执行批量插入操作。有关更多信息,请参见
SERVER-3819和SERVER-2395。
注意
对于分片群集上的批量插入,getLastError
仅此命令不足以验证成功。应用程序必须在应用程序逻辑中验证批量插入是否成功。
请参阅SERVER-2957案例和syslogFacility
运行时选项或
and 命令行选项的文档。mongod --syslog
mongos --syslog
touch
命令¶添加了touch
用于从集合读取数据和/或索引到内存的命令。请参阅:SERVER-2023和
touch
更多信息。
indexCounters
不再报告采样数据¶indexCounters
现在报告反映计数器使用和状态的实际计数器。在以前的版本中,这些数据是采样的。见
SERVER-5784和indexCounters
获取更多信息。
compact
命令上指定填充¶有关更多信息,请参见compact
和
SERVER-4018问题的文档。
现在,Boost库1.49版已嵌入MongoDB代码库中。
如果要使用系统Boost库构建MongoDB二进制文件,则可以scons
使用--use-system-boost
标记进行传递,如下所示:
在构建MongoDB时,您还可以传递scons
一个标志以仅使用系统库而不使用库的随附版本来编译MongoDB。例如:
有关更多信息,请参阅SERVER-3829和SERVER-5172问题。
为了提高性能,MongoDB 2.2使用了来自Google Perftools的TCMalloc内存分配器。有关此更改的更多信息,请参见SERVER-188和SERVER-4683。有关TCMalloc的更多信息,请参阅TCMalloc本身的文档。
当副本集的次要成员在复制中落后时,mongod
现在可以在日志中提供更好的报告。这样就可以总体上跟踪复制并确定哪个过程可能产生错误或停止复制。有关更多信息,请参见
SERVER-3575。
新的replSetSyncFrom
命令和新
rs.syncFrom()
帮手的mongo
外壳有可能使您手动配置从哪个成员集合的副本将轮询OPLOG条目。如果需要,可以使用这些命令覆盖默认选择逻辑。replSetSyncFrom
覆盖默认行为时请务必谨慎。
buildIndexes: false
为防止副本集的成员之间存在不一致,如果副本集的成员已
buildIndexes
设置为true
,则副本集的其他成员将不会与此成员进行同步,除非它们也已
buildIndexes
设置为
true
。有关更多信息,请参见SERVER-4160。