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
。- 列表
索引
和mongo
shell 助手方法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。这些功能包括: