On this page
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 或驱动程序中发布时,以下操作不返回任何输出:
show collectionsshow tables
连接到使用 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()操作不能保证数据文件不会更改。因此,请勿为了创建备份而使用这些方法来确保一致性。
支持触摸命令
动态记录分配
MongoDB 3.0 不再支持动态记录分配并弃用paddingFactor。
MongoDB 3.0 弃用了newCollectionsUsePowerOf2Sizes参数,因此您不再可以使用该参数来禁用集合的 2 种大小分配的功能。而是使用带有noPadding标志的collMod命令或带有noPadding选项的db.createCollection()方法。仅对工作负载仅包含插入或就地更新(例如递增计数器)的集合设置noPadding。
有关更多信息,请参见MMAPv1 记录分配行为更改。
Replication Changes
副本集操作日志格式更改
MongoDB 3.0 与 2.2.1 之前的版本所生成的 oplog 条目不兼容。如果从这些版本之一升级,则必须 await 新的 oplog 条目覆盖由这些版本之一生成的* all *旧的 oplog 条目,然后才能升级到 3.0.0 或更早版本。
如果辅助节点使用索引构建操作重播 2.6 之前的操作日志,而该操作在 2.6 或更高版本的主要节点上失败,则辅助节点可能会中止。
副本集配置验证
MongoDB 3.0 对副本集配置设置和副本集无效的副本集配置提供了更严格的验证。
更严格的验证包括:
仲裁员只能有
1票。以前,仲裁者也可以将members[n].votes的值设置为0。如果仲裁器的members[n].votes值为1以外的值,则必须修正该设置。非仲裁员成员只能“ **”具有_3 或_4 的值members[n].votes。如果非仲裁员成员具有members[n].votes的任何其他值,则必须修正此设置。
副本集配置中的_id必须指定与
--replSet或replication.replSetName指定的名称相同的名称。否则,您必须修复设置。不允许
0表示settings.getLastErrorDefaults的值。如果settings.getLastErrorDefaults的值为0,则必须修正设置。settings只能包含可识别的设置。以前,MongoDB 会忽略无法识别的设置。如果settings包含无法识别的设置,则必须删除无法识别的设置。
要在升级到 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 工具mongodump,mongorestore,mongoexport,mongoimport,mongofiles和mongooplog的 3.0 版本必须连接到正在运行的 MongoDB 实例,并且这些工具不能像以前的版本那样直接使用--dbpath修改数据文件。使用这些工具之前,请确保启动mongod实例。
Removed Options
删除了mongodump,mongorestore,mongoimport,mongoexport和bsondump的
--dbpath,--journal和--filter选项。删除了mongotop的
--locks选项。删除了bsondump和mongorestore的
--noobjcheck选项。删除了mongoexport的
--csv选项。使用新的--type选项指定导出格式类型(csv或json)。
See also
分片群集设置
删除 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,则查询将返回现有authSchema的currentVersion。
如果您当前没有任何用户或您正在使用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配置文件设置和mongod和mongos的--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 索引和地理空间附近查询
MongoDB 不再使用 100 个文档的默认限制。
指定batchSize()不再类似于指定limit()。
对于使用2d索引的$nearSphere查询,MongoDB 不再使用 100 个文档的默认限制。
驱动程序兼容性更改
每个官方支持的驱动程序都发布了一个版本,该版本包括对 MongoDB 3.0 中引入的所有新功能的支持。强烈建议在升级过程中升级到这些版本之一。
由于功能上的更改,在某些情况下需要**升级驱动程序:
使用
SCRAM-SHA-1身份验证方法使用调用listIndexes或listCollections的功能
最低 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与任何文档都不匹配,则findAndModify在value字段中返回null,而与sort规范无关。
在以前的版本中,如果为更新指定了sort和upsert: true,并且未设置new选项或new: false,则findAndModify在value字段中返回一个空文档{}。
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.indexes和system.namespaces集合的“直接”访问。请改用createIndexes和listIndexes命令。另请参见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 中不再可用:
closeAllDatabasesgetoptimetextindexStats,db.collection.getIndexStats()和db.collection.indexStats()
MongoDB 3.0 中不推荐使用以下命令和方法:
此外,您不能使用现在不建议使用的eval命令或db.eval()方法来调用mapReduce或db.collection.mapReduce()。
日期和时间戳比较 Sequences
为了进行比较,MongoDB 3.0 不再将Timestamp和Date数据类型视为等效。相反,Timestamp数据类型具有比Date数据类型更高的比较/排序 Sequences(即“更大”)。如果您的应用程序依赖于 Date 和 Timestamp 对象的等效比较/排序 Sequences,请在升级之前相应地修改您的应用程序。
服务器状态输出更改
serverStatus命令和db.serverStatus()方法不再在输出中返回workingSet,indexCounters和recordStats部分。
Unix 套接字权限更改
Unix 域套接字文件权限现在默认为0700。要更改权限,MongoDB 提供了net.unixDomainSocket.filePermissions设置以及--filePermission选项。
cloneCollection
现在,如果集合已经存在,则cloneCollection命令和db.cloneCollection()方法将返回错误,而不是将其插入其中。