MongoDB 3.0 中的兼容性更改

在本页面

以下 3.0 更改可能会影响与旧版 MongoDB 的兼容性。有关 3.0 更改的完整列表,请参见MongoDB 3.0 发行说明

Storage Engine

配置文件选项更改

随着 3.0 中其他存储引擎的引入,一些配置文件选项已更改:

Previous Setting New Setting
storage.journal.commitIntervalMs storage.mmapv1.journal.commitIntervalMs
storage.journal.debugFlags storage.mmapv1.journal.debugFlags
storage.nsSize storage.mmapv1.nsSize
storage.preallocDataFiles storage.mmapv1.preallocDataFiles
storage.quota.enforced storage.mmapv1.quota.enforced
storage.quota.maxFilesPerDB storage.mmapv1.quota.maxFilesPerDB
storage.smallFiles storage.mmapv1.smallFiles

3 .0 mongod实例与现有配置文件向后兼容,但是如果您尝试使用旧设置,则会发出警告。

数据文件必须对应于已配置的存储引擎

dbPath目录中的文件必须对应于已配置的存储引擎(即--storageEngine)。如果dbPath包含由--storageEngine指定的存储引擎以外的存储引擎创建的数据文件,则mongod将不会启动。

See also

将 MongoDB 升级到 3.0中的存储引擎更改为 WiredTiger 部分

WiredTiger 和驱动程序版本兼容性

对于使用 WiredTiger 存储引擎的 MongoDB 3.0 部署,在先前版本的mongo shell 或驱动程序中发布时,以下操作不返回任何输出:

连接到使用 WiredTiger 的 3.0 mongod实例时,请使用 3.0 mongo shell 或官方驱动程序的3 .0 兼容版本。 2.6.8 mongo shell 也与使用 WiredTiger 的 3.0 mongod实例兼容。

db.fsyncLock()与 WiredTiger 不兼容

使用 WiredTiger,db.fsyncLock()db.fsyncUnlock()操作不能保证数据文件不会更改。因此,请勿为了创建备份而使用这些方法来确保一致性。

支持触摸命令

如果存储引擎不支持touch,则touch命令将返回错误。

动态记录分配

MongoDB 3.0 不再支持动态记录分配并弃用paddingFactor

MongoDB 3.0 弃用了newCollectionsUsePowerOf2Sizes参数,因此您不再可以使用该参数来禁用集合的 2 种大小分配的功能。而是使用带有noPadding标志的collMod命令或带有noPadding选项的db.createCollection()方法。仅对工作负载仅包含插入或就地更新(例如递增计数器)的集合设置noPadding

Warning

仅将工作负载具有* no *导致文档增长的更新操作的集合(例如具有仅插入的工作负载的集合)设置noPaddingtrue。有关更多信息,请参见无填充分配策略

有关更多信息,请参见MMAPv1 记录分配行为更改

Replication Changes

副本集操作日志格式更改

MongoDB 3.0 与 2.2.1 之前的版本所生成的 oplog 条目不兼容。如果从这些版本之一升级,则必须 await 新的 oplog 条目覆盖由这些版本之一生成的* all *旧的 oplog 条目,然后才能升级到 3.0.0 或更早版本。

如果辅助节点使用索引构建操作重播 2.6 之前的操作日志,而该操作在 2.6 或更高版本的主要节点上失败,则辅助节点可能会中止。

副本集配置验证

MongoDB 3.0 对副本集配置设置和副本集无效的副本集配置提供了更严格的验证。

更严格的验证包括:

要在升级到 MongoDB 3.0 之前修复设置,请连接到主副本,并将reconfigure副本集设置为有效的配置设置。

如果您已经升级到 MongoDB 3.0,则必须先降级到 MongoDB 2.6然后修复设置。拥有reconfigured个副本集后,您可以重新升级到 MongoDB 3.0.

w 的变化:多数语义

当大多数* voting *成员复制写操作时,将满足w: majority值的写关注。在以前的版本中,“多数”是指集合中所有有投票权和无投票权的成员中的大多数。

删除 local.slaves 集合

MongoDB 3.0 删除了跟踪辅助副本复制进度的local.slaves集合。若要跟踪复制进度,请使用rs.status()方法。

副本集状态更改

从 3.0.0 版本开始,FATAL副本集状态不存在。

HTTP Interface

HTTP 接口(即net.http.enabled)不再报告复制数据。

MongoDB 工具变更

需要一个正在运行的 MongoDB 实例

MongoDB 工具mongodumpmongorestoremongoexportmongoimportmongofilesmongooplog的 3.0 版本必须连接到正在运行的 MongoDB 实例,并且这些工具不能像以前的版本那样直接使用--dbpath修改数据文件。使用这些工具之前,请确保启动mongod实例。

Removed Options

分片群集设置

删除 releaseConnectionsAfterResponse 参数

现在,MongoDB 总是在响应后释放连接。 releaseConnectionsAfterResponse参数不再可用。

Security Changes

MongoDB 2.4 用户模型已删除

MongoDB 3.0 完全删除了对不推荐使用的 2.4 用户模型的支持。如果存在使用 2.4 模式的用户数据(即authSchema版本小于3),则 MongoDB 3.0 将退出并显示一条错误消息。

要验证现有 2.6 模式的版本,请查询admin数据库中的system.version集合:

Note

您必须具有查询集合的特权。

use admin
db.system.version.find( { _id: "authSchema" })

如果您当前正在使用auth且具有架构版本 2 或 3,则查询将返回现有authSchemacurrentVersion

如果您当前没有任何用户您正在使用authSchema版本 1,则查询将不会返回任何结果。

如果authSchema版本小于3或查询未返回任何结果,请参见将用户授权数据升级到 2.6 格式升级authSchema版本,然后再升级到 MongoDB 3.0.

将 MongoDB 从 2.6 升级到 3.0 后,若要使用新的SCRAM-SHA-1挑战响应机制(如果您已有用户数据),则需要再次升级身份验证架构。这会将MONGODB-CR用户模型升级到SCRAM-SHA-1用户模型。有关详情,请参见升级到 SCRAM

Localhost 异常已更改

在 3.0 中,更改了 localhost 异常,以便“仅” *这些连接有权在admin数据库上创建第一个用户。在以前的版本中,使用 localhost 异常获得访问权限的连接对 MongoDB 实例的访问不受限制。

有关更多信息,请参见Localhost Exception

db.addUser() Removed

3 .0 删除旧版db.addUser()方法。请改用db.createUser()db.updateUser()

TLS/SSL 配置选项更改

MongoDB 3.0 引入了新的net.ssl.allowConnectionsWithoutCertificates配置文件设置和mongodmongos--sslAllowConnectionsWithoutCertificates命令行选项。这些选项替代了先前的net.ssl.weakCertificateValidation--sslWeakCertificateValidation选项,它们已成为别名。更新您的配置以确保将来的兼容性。

TLS/SSL 证书验证

默认情况下,当以 SSL 模式运行时,如果其证书(即net.ssl.PemKeyFile)有效,则 MongoDB 实例将启动。您可以使用net.ssl.allowInvalidCertificates设置或--sslAllowInvalidCertificates命令行选项禁用此行为。

要使用--ssl启动mongo shell,必须在启动时显式指定--sslCAFile--sslAllowInvalidCertificates选项。有关更多信息,请参见Client 端的 TLS/SSL 配置

TLS/SSL 证书主机名验证

默认情况下,MongoDB 会根据那些证书中列出的主机名来验证尝试使用证书进行连接的主机的主机名。在某些部署情况下,此行为可能是不希望的。现在可以禁用这种主机名验证,而无需使用net.ssl.allowInvalidHostnames设置或--sslAllowInvalidHostnames命令行选项来禁用其余证书信息的验证。

SSLv3 密码已禁用

根据旧版 SSL 密码中的漏洞,这些密码已在 MongoDB 中明确禁用。无需更改配置。

mongo Shell 版本兼容性

mongo shell 3.0 之前的版本与强制执行访问控制的 MongoDB 3.0 部署“不兼容”。如果您有需要访问控制的 3.0 MongoDB 部署,则必须使用mongo shell 的 3.0 版本。

HTTP 状态界面和 REST API 兼容性

HTTP 状态接口和 REST API 都不支持版本 3.0 中引入的SCRAM-SHA-1挑战响应用户身份验证机制。

Indexes

删除 dropDups 选项

createIndex()ensureIndex()createIndexes不再提供dropDups选项。

后台索引编制过程中对重新启动行为的更改

对于 3.0 mongod实例,如果mongod进程终止时正在进行后台索引构建,则在实例重新启动时,索引构建将作为前台索引构建重新启动。如果索引构建遇到任何错误,例如重复键错误,则mongod将退出并显示错误。

要在索引构建失败后启动mongod,请使用storage.indexBuildRetry--noIndexBuildRetry在启动时跳过索引构建。

2d 索引和地理空间附近查询

对于使用2d索引的$near查询:

对于使用2d索引的$nearSphere查询,MongoDB 不再使用 100 个文档的默认限制。

驱动程序兼容性更改

每个官方支持的驱动程序都发布了一个版本,该版本包括对 MongoDB 3.0 中引入的所有新功能的支持。强烈建议在升级过程中升级到这些版本之一。

由于功能上的更改,在某些情况下需要**升级驱动程序:

最低 3.0 兼容的驱动程序版本是:

Driver Language 最低 3.0 兼容版本
C 1.1.0
C++ 1.0.0
C# 1.10
Java 2.13
Node.js 1.4.29
Perl 1.0.0
PHP ext-mongo 1.6, ext-mongodb 1.0
Python 2.8
Motor 0.4
Ruby 1.12
Scala 2.8.0

通用兼容性更改

findAndModify return凭证

在 MongoDB 3.0 中,如果使用findAndModify进行更新同时指定upsert: true和*,则未设置new选项或new: false,如果query与任何文档都不匹配,则findAndModifyvalue字段中返回null,而与sort规范无关。

在以前的版本中,如果为更新指定了sortupsert: true,并且未设置new选项或new: false,则findAndModifyvalue字段中返回一个空文档{}

upsert:true,带有点_id 查询

当您使用upsert: true执行update()并且查询不匹配现有文档时,如果查询使用dot notation_id字段中指定条件,则 MongoDB 将拒绝插入新文档。

此限制可确保正确定义_id文档中嵌入的字段的 Sequences,并且不与查询中指定的 Sequences 绑定

如果您尝试以这种方式插入文档,MongoDB 将引发错误。

例如,考虑以下更新操作。由于更新操作指定upsert:true且查询使用点表示法在_id字段上指定条件,因此在构造要插入的文档时,更新将导致错误。

db.collection.update( { "_id.name": "Robert Frost", "_id.uid": 0 },
   { "categories": ["poet", "playwright"] },
   { upsert: true } )

反对访问 system.indexes 和 system.namespaces

MongoDB 3.0 不赞成对system.indexessystem.namespaces集合的“直接”访问。请改用createIndexeslistIndexes命令。另请参见WiredTiger 和驱动程序版本兼容性

集合名称验证

MongoDB 3.0 更一致地强制执行集合命名限制。确保您的应用程序不会创建或依赖无效的集合名称。

Platform Support

在 32 位平台(Linux 和 Windows)上,不再为 MongoDB 提供商业支持。 Linux RPM 和 DEB 软件包也不再可用。但是,二进制存档仍然可用。

Linux 软件包系统信息库

适用于 3.0 及更高版本的非企业级 MongoDB Linux 软件包位于新的存储库中。按照相应的Linux 安装说明从新位置安装 3.0 软件包。

Removed/Deprecated Commands

以下命令和方法在 MongoDB 3.0 中不再可用:

MongoDB 3.0 中不推荐使用以下命令和方法:

此外,您不能使用现在不建议使用的eval命令或db.eval()方法来调用mapReducedb.collection.mapReduce()

日期和时间戳比较 Sequences

为了进行比较,MongoDB 3.0 不再将TimestampDate数据类型视为等效。相反,Timestamp数据类型具有比Date数据类型更高的比较/排序 Sequences(即“更大”)。如果您的应用程序依赖于 Date 和 Timestamp 对象的等效比较/排序 Sequences,请在升级之前相应地修改您的应用程序。

服务器状态输出更改

serverStatus命令和db.serverStatus()方法不再在输出中返回workingSetindexCountersrecordStats部分。

Unix 套接字权限更改

Unix 域套接字文件权限现在默认为0700。要更改权限,MongoDB 提供了net.unixDomainSocket.filePermissions设置以及--filePermission选项。

cloneCollection

现在,如果集合已经存在,则cloneCollection命令和db.cloneCollection()方法将返回错误,而不是将其插入其中。

首页