MongoDB 4.4中的兼容性变化
以下4.4更改可能会影响与旧版本MongoDB的兼容性。
移除了命令
以下4.4更改可能会影响与旧版本的兼容性 MongoDB的版本。
| 删除了命令 | 移除了助手 | 替代品 |
|---|---|---|
cloneCollection |
db.cloneCollection() |
使用mongoexport和mongoimport,或使用聚合管道$out或$merge阶段,或使用驱动程序编写脚本。 |
planCacheListPlans |
PlanCache.getPlansByQuery() |
使用聚合管道阶段$planCacheStats或Use the mongo shell helper methodPlanCache.list(). (Available starting in version 4.4)另见$planCacheStats更改。 |
planCacheListQueryShapes |
PlanCache.listQueryShapes() |
使用聚合管道阶段$planCacheStats或Use the mongo shell helper methodPlanCache.list(). (Available starting in version 4.4)另见$planCacheStats更改。 |
移除了参数
MongoDB删除了以下服务器参数:
| 删除了参数 | 描述 |
|---|---|
failIndexKeyTooLong |
MongoDB 4.4删除了failIndexKeyTooLong参数。此参数在4.2中被弃用,因为具有功能兼容性版本(fCV)4.2+的MongoDB不再施加索引密钥限制。 |
工具变更
从4.4版本开始,社区版和企业版的Windows MSI安装程序不包括MongoDB数据库工具(mongoimport、mongoexport等)。要在Windows上下载和安装MongoDB数据库工具,请参阅安装MongoDB数据库工具。
如果您依赖MongoDB 4.2或之前的MSI安装程序与MongoDB服务器一起安装数据库工具,您现在必须单独下载数据库工具。
副本集
回滚目录
从Mongo 4.4开始,集合的回滚目录以集合的UUID而不是集合命名空间命名;例如
<dbpath>/rollback/20f74796-d5ea-42f5-8c95-f79b39bad190/removed.2020-02-19T04-57-11.0.bson
有关详细信息,请参阅回滚数据。
replSetGetStatus 输出字段更改
replSetGetStatus命令及其mongo shell helper rs.status()从其输出中删除了以下弃用字段:
| 已删除字段 | 替代品 |
|---|---|
syncingTo |
改用syncSourceHost。 |
members[n\].syncingTo |
改用members[n\].syncSourceHost。 |
复制品配置文档更改
MongoDB 4.4将term字段添加到副本集配置文档中。副本集成员使用term和version就“最新”副本配置达成共识。设置功能兼容性版本(fCV):“4.4”隐式执行replSetReconfig,将term字段添加到配置文档和块中,直到新配置传播到大多数副本集成员。同样,降级到fCV : "4.2"隐式执行重新配置以删除term字段。
操作的初始同步限制
从MongoDB 4.4开始,要在副本集成员上运行,以下操作要求该成员处于PRIMARY或SECONDARY状态。
如果成员处于其他状态,例如STARTUP2,则操作错误
在之前的版本中,当成员处于STARTUP2时,也可以运行操作。然而,操作要等到成员过渡到RECOVERING。
自定义 getLastErrorDefaults 值已弃用
从4.4版本开始,MongoDB不建议指定asettingssettings.getLastErrorDefaults值,而不是{ w: 1, wtimeout: 0 }的默认值。MongoDB 4.4尊重您指定的任何写入关注值,但未来的MongoDB版本可能不会尊重默认值以外的值。相反,请使用setDefaultRWConcern命令为副本集或分片集群设置默认的读或写关注配置。
预测兼容性变更
将字段设置为新值
从MongoDB 4.4开始,find和findAndModify()投影可以接受聚合表达式和聚合语法。
通过使用聚合表达式和语法,包括使用文字和聚合变量,如果您为投影字段值指定文字(数字或布尔值除外),则该字段将用新值投影。
例如,考虑包含astatus字段的文档的集合清单:
db.inventory.insertOne( { _id: 1, item: "postcard", status: "A", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] })
从MongoDB,4.4开始,以下操作用新值而不是当前值投影字段status和instock:
db.inventory.find(
{ status: "A" },
{ status: "Active", instock: ["blue", "crimson"] }
)
也就是说,该操作返回以下文档:
{ "_id" : 1, "status" : "Active", "instock" : [ "blue", "crimson" ] }
在之前的版本中,任何规范值(零/假值或以前不受支持的文档值除外)都被视为true,以指示将字段及其当前值包含。也就是说,在早期版本中,之前的操作返回一个文档,其中包含status和instock字段及其当前值:
{ "_id" : 1, "status" : "A", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }
$elemMatch投影字段顺序
从MongoDB 4.4开始,无论文档中字段的顺序如何,现有字段的$elemMatch投影都会在其他现有字段包含之后返回字段。
例如,考虑使用以下文档收集players:
db.players.insertOne( {
name: "player1",
games: [ { game: "abc", score: 8 }, { game: "xyz", score: 5 } ],
joined: new Date("2020-01-01"),
lastLogin: new Date("2020-05-01")
} )
在4.4+版本中,以下投影在投影中包含的其他现有字段之后返回games字段,即使文档中,该字段在joined和lastLogin字段之前列出:
db.players.find( {}, { games: { $elemMatch: { score: { $gt: 5 } } }, joined: 1, lastLogin: 1 } )
也就是说,该操作返回以下文档:
{
"_id" : ObjectId("5edef64a1c099fff6b033977"),
"joined" : ISODate("2020-01-01T00:00:00Z"),
"lastLogin" : ISODate("2020-05-01T00:00:00Z"),
"games" : [ { "game" : "abc", "score" : 8 } ]
}
在4.2及更早版本中,现有字段的$elemMatch投影支持文档中的顺序:
{
"_id" : ObjectId("5edef91e76ddff7d92f118e1"),
"games" : [ { "game" : "abc", "score" : 8 } ],
"joined" : ISODate("2020-01-01T00:00:00Z"),
"lastLogin" : ISODate("2020-05-01T00:00:00Z")
}
$slice嵌入式数组
从MongoDB 4.4开始,当投影是包含投影的一部分时,嵌套文档中数组的$slice投影不再返回嵌套文档中的其他字段。
例如,考虑包含asize字段的文档的集合inventory:
{ item: "socks", qty: 100, details: { colors: [ "blue", "red" ], sizes: [ "S", "M", "L"] } }
从MongoDB 4.4开始,以下操作仅用指定colors组切片投影_id字段(默认)、qty字段和details字段:
db.inventory.find( { }, { qty: 1, "details.colors": { $slice: 1 } } )
也就是说,该操作返回以下文档:
{ "_id" : ObjectId("5ee92a6ec644acb6d13eedb1"), "qty" : 100, "details" : { "colors" : [ "blue" ] } }
如果$slice投影是排除投影的一部分,则该操作将继续返回嵌套文档中的其他字段。也就是说,以下预测是排除预测。投影排除_id字段和colors数组中位于指定切片之外的元素,并返回所有其他字段。
db.inventory.find( { }, { _id: 0, "details.colors": { $slice: 1 } } )
{ "item" : "socks", "qty" : 100, "details" : { "colors" : [ "blue" ], "sizes" : [ "S", "M", "L" ] } }
$slice投影本身被认为是一个排除。
在之前的版本中,$slice投影还包括嵌套文档中的其他字段,无论投影是包含还是排除。
路径冲突限制
路径冲突: 嵌入文档及其字段
从MongoDB 4.4开始,使用任何嵌入式文档的字段投影嵌入式文档是非法的。
例如,考虑包含asize字段的文档的集合inventory:
{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... }
从MongoDB 4.4开始,以下操作失败,并出现Path collision错误,因为它试图同时投影size文档和size.uom字段:
db.inventory.find( {}, { size: 1, "size.uom": 1 } ) // Invalid starting in 4.4
在之前的版本中,嵌入式文档及其字段之间的后期投影决定了投影:
- 如果嵌入式文档的投影是在对其字段的任何和所有投影之后进行的,MongoDB会投影嵌入式文档。例如,投影文档
{ "size.uom": 1, size: 1 }产生与投影文档{ size: 1 }相同的结果。 - 如果嵌入式文档的投影在投影之前,MongoDB会投影指定的字段。例如,投影文档
{ "size.uom": 1, size: 1, "size.h": 1 }产生与投影文档{ "size.uom": 1, "size.h": 1 }相同的结果。
路径冲突: 数组的$slice和嵌入字段 $slice
从MongoDB 4.4开始,查找和findAndModify()投影不能同时包含数组的$slice和嵌入在数组中的字段。
例如,考虑包含数组字段instock的集合inventory:
{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }
从MongoDB 4.4开始,以下操作失败,并出现Path collision错误:
db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } ) // Invalid starting in 4.4
在之前的版本中,投影同时应用投影,并返回instock数组中的第一个元素($slice: 1但抑制投影元素中的warehouse字段。从MongoDB 4.4开始,要实现相同的结果,请使用带有两个单独的$project阶段的db.collection.aggregate()方法。
$-前缀字段路径限制
从MongoDB 4.4开始,find和findAndModify()投影不能投影以$开头的字段,但DBRef字段除外。
例如,从MongoDB 4.4开始,以下操作无效:
db.inventory.find( {}, { "$instock.warehouse": 0, "$item": 0, "detail.$price": 1 } ) // Invalid starting in 4.4
在早期版本中,MongoDB忽略了$前缀的字段预测。
$ 位置运算符放置限制
从MongoDB 4.4开始,$投影运算符只能出现在字段路径的末尾;例如"field.$"或"fieldA.fieldB.$"
例如,从MongoDB 4.4开始,以下操作无效:
db.inventory.find( { }, { "instock.$.qty": 1 } ) // Invalid starting in 4.4
要解决,请删除跟随$投影运算符的字段路径的组件。
在之前的版本中,MongoDB忽略了路径中跟随$的部分;即投影被视为"instock.$"
$ 位置运算符和 $slice 限制
从MongoDB 4.4开始,查找和findAndModify()投影不能将$slice投影表达式作为$投影表达式的一部分。
例如,从MongoDB 4.4开始,以下操作无效:''
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } ) // Invalid starting in 4.4
在以前的版本中,MongoDB返回第一个元素(instock.$)在符合查询条件的库存数组中;即位置投影“instock.”“优先,并且$slice:1为空操作。“instock.$“:{ $切片:1 }不排除任何其他文档字段。
空字段名投影限制
从MongoDB 4.4开始,查找和findAndModify()投影不能包含空字段名称的投影。
例如,从MongoDB 4.4开始,以下操作无效:
db.inventory.find( { }, { "": 0 } ) // Invalid starting in 4.4
在之前的版本中,MongoDB将空字段的包含/排除视为对不存在字段的投影。
文本搜索元数据{ $meta: "textScore" }查询要求
从MongoDB 4.4开始,您必须在db.collection.find()操作的查询谓词中指定$text运算符,以便在投影或排序中使用{ $meta: "textScore" }表达式。例如:
db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
);
db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } );
如果您没有在查询谓词中指定$text运算符,则操作失败。例如,从MongoDB 4.4开始,以下操作无效:
db.articles.find(
{ },
{ score: { $meta: "textScore" } }
)
db.articles.find(
{ },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } );
$sort变化
从MongoDB 4.4开始,sort()方法现在使用与$sort聚合阶段相同的排序算法。通过此更改,对包含重复值的字段执行sort()的查询更有可能导致这些值的排序顺序不一致。
为了保证在重复值上使用sort()时的排序一致性,请在排序中包含一个仅包含唯一值的附加字段。
这可以通过将_id字段添加到您的排序中来轻松实现。
有关更多信息,请参阅排序一致性。
映射减少更改
减少包含单个值的键
从MongoDB 4.4开始,当您运行mapReduce命令时,无论关联密钥中包含多少值,MongoDB都会调用reduce函数。
在早期版本中,MongoDB不会为具有单个值的键调用reduce函数。
有关更多信息,请参阅使用情况。
映射-减少输出更改
从MongoDB 4.4开始,mapReduce从其输出中删除counts字段。
在早期版本中,该命令在其输出中包含一个counts字段。例如:
"counts" : {
"input" : 4,
"emit" : 4,
"reduce" : 1,
"output" : 2
},
映射函数的发射限制
从MongoDB 4.4开始,map函数不再将每个emit()输出的大小限制在MongoDB最大BSON文档大小的一半。
在早期版本中,单个发射只能容纳MongoDB最大BSON文档大小的一半
删除对具有范围的BSON类型JavaScript代码的支持
mapReduce不再支持其函数的不建议使用的具有范围的BSON类型JavaScript代码(BSON类型15)。map、reduce和finalize函数必须是BSON类型String(BSON Type 2)或BSON类型JavaScript(BSON Type 13)。要传递可以在map中访问的常量值,reduce和finalize函数,请使用scope域参数。
自4.2.1版本以来,不建议使用具有mapReduce函数范围的JavaScript代码。
另见:
结构化日志记录
从MongoDB 4.4开始,mongod / mongos实例现在以结构化JSON格式输出所有日志消息。这包括发送到文件、syslog和stdout(标准输出)日志目标的日志输出,以及getLog命令的输出。
以前,日志条目作为明文输出。
如果您有现有的日志解析实用程序,或使用日志摄取服务,您可能需要使用MongoDB 4.4为新的结构化日志格式重新配置这些工具。
有关新结构化日志格式的详细检查,请参阅日志消息,包括使用新日志结构进行日志解析的示例。
删除 rs getLog值
从MongoDB 4.4开始, getLog命令不再接受rs值,因为已经不建议使用这种消息类型的分类。相反,日志消息现在总是由其组件标识,包括复制消息的REPL。
有关在组件字段上过滤的日志解析示例,请参阅按组件过滤。
时间戳格式
随着向结构化JSON日志记录的过渡,不再支持ctime时间戳格式。以下配置选项不再接受ctime作为有效参数:
改用iso8601-local(默认)或iso8601-utc时间戳格式。
maxLogSizeKB参数
随着向结构化JSON日志记录的过渡,maxLogSizeKB服务器参数现在可以截断日志条目中超过指定限制的任何单个属性。以前,此参数将截断整个日志条目。
此外:
maxLogSizeKB现在接受0的值,这完全禁用截断。maxLogSizeKB不再接受负值。
有关更多信息,请参阅日志消息截断。
一般变化
- MongoDB 4.4取消了对gperftools cpu分析器的支持。作为此更改的一部分,
hostManager不再在集群上提供cpuProfiler特权操作。 - 参数
ldapConnectionPoolMaximumConnectionsPerHost现在默认值为2。在之前的版本中,默认值未设置。 serverStatus返回flowControl.locksPerKiloOp而不是flowControl.locksPerOp。$dateFromParts表达式运算符现在支持year和isoWeekYear字段的值范围为1-9999。在之前的版本中,这些字段支持的值范围为0-9999。- 列表
索引和mongoshell 助手方法db.collection.getIndexes()不再返回 索引规范文档中的名称空间ns字段。 - MongoDB 4.4删除了
--noIndexBuildRetry命令行选项和相应的storage.indexBuildRetry选项。 mongos现在,如果您将空的writeConcern值(即writeConcern: {}传递给不支持写入问题的命令,则会记录错误。在早期版本中,mongos忽略了这些命令的空writeConcern值。- 带有
compact命令的force选项不再是boolean.force: true和force: false已被弃用,并将导致错误。
db.collection.validate()参数更改
mongo方法db.collection.validate()不再只接受布尔参数。
也就是说,该方法不再接受db.collection.validate(<boolean>)作为速记ftbdb.collection.validate({full: <boolean>})
| 代替 | 使用 |
|---|---|
db.collection.validate(true) |
db.collection.validate({ full: true }) |
db.collection.validate(false) |
db.collection.validate()-或-db.collection.validate({ full: false }) |
全面验证oplog
从MongoDB 4.4开始,WiredTigeroplog上的完整验证跳过了更彻底的检查。validate.warnings包括该行为的通知。
MMAPv1清理
dbStats命令不再返回过时的MMAPv1numExtents字段。replSetGetStatus命令不再在其输出中返回过时的MMAPv1字段replSetGetStatus.initialSyncStatus.fetchedMissingDocs。fsync命令不再接受过时的MMAPv1字段async作为选项。
弃用
地理空间
MongoDB 4.4不建议使用geoHaystack索引和geoSearch命令。使用$geoNear或$geoWithin的2d索引。
BSON类型带范围的JavaScript代码
从MongoDB 4.4开始:
$where不再支持不建议使用的带范围的BSON类型JavaScript代码(BSON类型15)。$where运算符仅支持BSON类型String(BSON Type 2)或BSON类型JavaScript(BSON Type 13)。mapReduce不再支持其函数的不建议使用的带范围的BSON类型JavaScript代码(BSON类型15)。map、reduce和finalize函数必须是BSON类型String(BSON Type 2)或BSON类型JavaScript(BSON Type 13)。要传递可以在map中访问的常量值,reduce和finalize函数,请使用作用scope参数。
自MongoDB 4.2.1以来,不建议使用范围为$where和mapReduce函数的BSON类型JavaScript代码。
分片
MongoDB 4.4不建议使用以下分片命令:
Lookaside Table Overflow文件大小限制
从MongoDB 4.4开始,WiredTiger lookaside表(LAS)缓存溢出文件不再存在。因此,MongoDB 4.4不建议使用(LAS)缓存溢出文件限制的以下选项和参数;这些选项和参数从MongoDB 4.4开始无效:
storage.wiredTiger.engineConfig.maxCacheOverflowFileSizeGB配置文件选项--wiredTigerMaxCacheOverflowFileSizeGB命令行选项wiredTigerMaxCacheOverflowSizeGB参数
4.4 功能兼容性
4.4中的一些功能不仅需要4.4二进制文件,还需要将功能兼容性版本(fCV)设置为4.4。这些功能包括: