本文介紹MongoDB 4.2版本的相容性變化。
如需查看MongoDB官網相容性更新說明文檔,請前往MongoDB官網下載。
移除MMAPv1儲存引擎
MongoDB 4.2刪除了對MMAPv1儲存引擎的支援。
如果您在4.0版本使用了MMAPv1儲存引擎,請在升級到4.2版本前將儲存引擎更改為WiredTiger儲存引擎。
MMAPv1特定配置選項
MongoDB刪除了以下MMAPv1特定的配置選項:
刪除的配置 | 刪除的命令列 |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
從4.2版本開始,MongoDB將不再使用上述配置和命令。如果您使用了WiredTiger部署,請刪除MMAPv1的配置選項。
MMAPv1特定參數
MongoDB刪除了以下MMAPv1參數:
newCollectionsUsePowerOf2SizesreplIndexPrefetch
MMAPv1特定命令
MongoDB刪除了MMAPv1特定的touch命令。
命令和方法的MMAPv1特定選項
MongoDB刪除了MMAPv1的特定選項:
collMod命令的noPadding和usePowerOf2Sizes。collStats命令的verbose。create命令的flags。db.createCollection()命令的paddingFactor、paddingBytes和preservePadding。
MongoDB會忽略fsync命令中MMAPv1特定選項async。
刪除或棄用的命令和方法
移除對group命令的支援
從4.2版本開始,MongoDB移除了group命令(該命令已於3.4版本棄用)及其mongo shell協助函數db.collection.group()。
請改用帶$group階段的db.collection.aggregate()。
移除對eval命令的支援
從4.2版本開始,MongoDB移除了eval命令。eval命令已於3.0版本棄用。
mongo shell的協助函數db.eval()和db.collection.copyTo()只能在串連到MongoDB 4.0及之前版本時運行。
移除對copydb和clone命令的支援
從4.2版本開始,MongoDB移除了copydb命令和clone命令。mongo shell的協助函數db.copyDatabase()和db.cloneDatabase()只能在串連到MongoDB 4.0及之前版本時運行。
請改用mongodump和mongorestore(需配合mongorestore選項的--nsFrom和--nsTo參數使用)或使用驅動程式編寫指令碼。
例如,將test 資料庫複寫到同執行個體的 examples 資料庫,您可以:
用於
mongodump將test資料庫轉儲到歸檔檔案mongodump-test-db。mongodump --archive="mongodump-test-db" --db=test使用
mongorestore搭配--nsFrom和--nsTo參數從存檔中恢複。mongorestore --archive="mongodump-test-db" --nsFrom='test.*' --nsTo='examples.*'
您可以按需添加參數,例如 --uri、--host、--username 等。
您也可以不使用封存檔案,通過 mongodump將test資料庫連接到標準輸出資料流,並通過管道傳遞到mongorestore。
mongodump --archive --db=test | mongorestore --archive --nsFrom='test.*' --nsTo='examples.*'移除對parallelCollectionScan命令的支援
從4.2版本開始,MongoDB移除了parallelCollectionScan命令。
移除maxScan選項
MongoDB移除了find命令和mongo shell協助函數cursor.maxScan()中的maxScan選項。請改用find命令的maxTimeMS選項,或使用mongo shell中的cursor.maxTimeMS()。
移除對geoNear命令的支援
從4.2版本開始,MongoDB 移除了geoNear命令。請改用$geoNear彙總階段。
對於$geoNear階段,除了以下例外,選項與已移除的geoNear命令相似:
已移除的
geoNear命令的輸出中包含名為dis的欄位,其中包含距離資訊。對於
$geoNear階段,請在distanceField中指定距離欄位名稱。已移除的
geoNear命令接受includeLocs選項的布爾值以包含loc欄位。對於
$geoNear階段,請在includeLocs中指定位置欄位名稱。已移除的
geoNear命令返回結果中包含avgDistance和maxDistance。你可以使用彙總管道在
geoNear階段之後使用group階段來返回avgDistance和maxDistance。db.places.aggregate([ { $geoNear: { near: <...>, distanceField: "dis", includeLocs: "loc", spherical: true, ... } }, { $group: { _id: null, objectsLoaded: { $sum: 1 }, maxDistance: { $max: "$dis" }, avgDistance: { $avg: "$dis" } } } ])
移除對 repairDatabase 命令的支援
從4.2版本開始,MongoDB移除了repairDatabase命令、mongo shell協助函數db.repairDatabase()、以及repairDatabase許可權。
替代方法:
對mongod進行資料壓縮,請使用
compact命令。對單節點執行個體進行索引重建,請使用
reIndex命令或其協助函數db.collection.reIndex()。對單節點執行個體進行資料恢複,請使用
mongod --repair。
移除對getPrevError命令的支援
從4.2版本開始,MongoDB 移除了getPrevError命令及其mongo shell協助函數db.getPrevError()。
棄用 cloneCollection 命令
MongoDB 棄用了cloneCollection命令及其mongo shell協助函數db.cloneCollection()。
請改用mongoexport和mongoimport命令,或編寫一個使用驅動的指令碼。
棄用 PlanCache 命令
MongoDB棄用了以下內容:
PlanCache.getPlansByQuery()方法和planCacheListPlans命令。要擷取某個查詢模式的緩衝查詢計劃,請改用
$planCacheStats彙總階段。PlanCache.listQueryShapes()方法和planCacheListQueryShapes命令。要列出緩衝的查詢模式,請改用
$planCacheStats彙總階段。
彙總操作(Aggregation)
$out 階段限制
$out和視圖
定義視圖(view)的pipeline中不能包含$out階段。如果您現有的視圖包含$out階段,則無法從該現有視圖建立新視圖。
對於包含$out階段的現有視圖,您可以選擇刪除並重新建立不包含$out階段的視圖,或使用新的pipeline替換視圖定義,使其不包含$out階段。
$out和$lookup
$lookup階段的嵌套欄位中不能包含$out階段。
$out和Read Concern層級
$out階段不能與Read Concern層級"linearizable"結合使用。
$out和Explain
如果彙總階段包含$out階段,則無法在executionStats模式或allPlansExecution模式下運行db.collection.explain()協助函數(或explain命令)。
如果彙總階段包含$out階段,要查看executionStats或allPlansExecution資訊,請在不包含out階段的情況下運行explain,以便返回前面階段的explain結果。
或者,您可以在包含$out階段的彙總階段中以queryPlanner模式運行explain。
$out 和 Majority Read Concern層級
從 MongoDB 4.2 開始,您可以在包含$out階段的彙總操作中指定Read Concern層級為"majority"。
$geoNear移除了limit和num選項
從MongoDB 4.2開始,MongoDB刪除了$geoNear的limit和num選項,以及100的預設limit限制。如需限制$geoNear的結果,請使用帶有$limit階段的$geoNear階段。
例如,以下彙總樣本在4.2版本中將不生效($geoNear包含了num選項)。
db.places.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
distanceField: "distance",
num: 5, // Not supported in 4.2
spherical: true
}
}
])相反,您可以將彙總命令改寫為以下格式。
db.places.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
distanceField: "distance",
spherical: true
}
},
{ $limit: 5 }
])事務(Transactions)
從 MongoDB 4.2 開始,事務中的第一個操作不能是killCursors。
從 MongoDB 4.2 開始,事務中不能向capped collection寫入資料。從capped collection讀取資料仍支援在事務中進行。
從 MongoDB 4.2 開始,MongoDB移除了事務16 MB的總大小限制。在4.2版本中,MongoDB會建立儘可能多的oplog條目以包含事務中的所有寫操作。在4.2之前的版本中,MongoDB會建立一個包含事務中所有寫操作的單個條目,從而對事務施加16 MB的總大小限制。
變更流(Change Streams)
可用性
從MongoDB 4.2開始,您無需依賴對"majority"Read Concern層級支援,即可使用變更流。
在MongoDB 4.0及之前版本中,您只有在啟用"majority"Read Concern層級支援(預設啟用)時,才能使用變更流。
預設定序
從MongoDB 4.2開始,變更流使用簡單的二進位比較,除非提供顯式比較規則。在4.2之前的版本中,針對單個集合db.collection.watch()建立的變更流會繼承該集合的預設比較規則。
恢複令牌修改
從MongoDB 4.2開始,如果變更流彙總管道修改了事件的_id欄位,則會產生異常。
增加了接受串連所需的檔案描述符
從MongoDB 4.2開始,mongod或mongos執行個體接受1個串連需要兩個檔案描述符。在MongoDB 4.2之前版本中,入站串連只需要一個檔案描述符。
在從MongoDB 4.0升級到4.2之前,您可能需要增加open files 配置(ulimit -n)。
MongoDB工具
FIPS 模式
從4.2版本開始,MongoDB移除了以下程式的--sslFIPSMode選項:
mongodump
mongoexport
mongofiles
mongoimport
mongorestore
mongostat
mongotop。
上述程式在mongod和mongos執行個體中啟用了FIPS模式時會使用符合FIPS標準的串連。
擴充 JSON v2
工具 | 說明 |
bsondump | 使用擴充JSON v2.0(規範模式)格式。 |
mongodump | 使用擴充JSON v2.0(規範模式)格式輸出中繼資料。需要mongorestore版本4.2或更高版本,才能支援擴充JSON v2.0(規範模式或寬鬆模式)格式。 說明 通常情況下,應使用對應版本的mongodump和mongorestore。如需還原由特定版本mongodump建立的資料檔案,應使用相應版本的mongorestore。 |
mongoexport | 預設產生擴充 JSON v2.0(寬鬆模式)輸出。 如果指定 |
mongoimport | 預設期望匯入的資料為擴充JSON v2.0(寬鬆或規範模式)。 如果指定 說明 通常情況下,mongoexport和mongoimport的版本應保持一致。如需匯入由mongoexport建立的資料,應使用相應版本的mongoimport 。 |
查詢選項
從 4.2 版本開始,mongodump和mongoexport的--query選項必須使用擴充JSON v2格式(寬鬆或strict 模式),包括將欄位名稱和操作符用引號括起來,例如:
mongoexport -d=test -c=records -q='{ "a": { "$gte": 3 }, "date": { "$lt": { "$date": "2016-01-01T00:00:00.000Z" } } }' --out=exportdir/myRecords.json在4.2之前的版本中,查詢選項使用擴充JSON v1格式,欄位名稱和操作符不需要用引號括起來:
mongoexport -d=test -c=records -q='{ a: { $gte: 3 }, date: { $lt: { "$date": "2016-01-01T00:00:00.000Z" } } }' --out=exportdir/myRecords.json複本集狀態變更
Primary Step Down
從MongoDB 4.2開始,replSetStepDown(或通過replSetReconfig導致的下線)不再關閉所有用戶端串連。但仍在處理中的寫入會被終止。
在MongoDB 4.0及之前版本中,replSetStepDown在下線期間會關閉所有用戶端串連。
復原狀態(ROLLBACK State)
從4.2版本開始,當成員進入ROLLBACK狀態時,MongoDB會終止所有使用者操作。
4.2 版本驅動程式預設啟用可重試寫入
MongoDB已於3.6版本支援可重試寫入,但大多數MongoDB 3.6和4.0的官方驅動程式預設禁用此功能。對於這些驅動程式,可重試寫入可以通過在連接字串中指定retryWrites=true選項在串連層級啟用。
MongoDB 4.2及以後的官方驅動程式預設啟用可重試寫入。升級到 4.2 版本驅動程式的應用程式,如果需要使用可重試寫入,則無需指定retryWrites=true選項。如果需要禁用可重試寫入,則必須在連接字串中包含retryWrites=false選項。
local資料庫不支援可重試寫入。除非顯式禁用可重試寫入,否則使用升級到 4.2 版本的驅動程式在寫入local資料庫時會遇到寫入錯誤。
一般變更
索引
對reIndex的限制
MongoDB對reIndex命令或db.collection.reIndex()函數添加了更嚴格的限制,禁止在mongos上運行reIndex和db.collection.reIndex()。
對db.collection.dropIndex()的限制
你不能使用db.collection.dropIndex()來刪除所有非_id索引。請改用db.collection.dropIndexes()進行刪除。
建立重複索引的錯誤資訊
從4.2版本開始,如果您建立了一個索引,然後嘗試使用另一個名稱建立相同的索引,createIndexes命令以及mongo shell協助函數db.collection.createIndex()和db.collection.createIndexes()會返回錯誤。
{
"ok" : 0,
"errmsg" : "Index with name: x_1 already exists with a different name",
"code" : 85,
"codeName" : "IndexOptionsConflict"
}如果在4.0和更早版本中執行此操作,MongoDB不會重新建立索引,但仍會返回一個包含以下內容的資訊。
{
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}PowerPC 上的雜湊索引
對於雜湊索引,MongoDB 4.2確保了在PowerPC上,浮點數 263的雜湊值與其他平台一致。在4.2之前的版本中,PowerPC上浮點數263的雜湊值與其他平台不一致。
儘管建立雜湊索引時的欄位不支援大於253的浮點數值,但用戶端仍然可以插入索引欄位的值為263的文檔。
如果MongoDB 4.0分區叢集在PowerPC上的分區鍵包含263的雜湊值,在升級分區叢集到4.2之前必須考慮額外因素。
min()/max()
從MongoDB 4.2開始,當您在db.collection.find()操作中指定min()/max()時,必須顯式地指定與min()/max()對應的索引,除非find()查詢是對_id欄位的等值條件{ _id: }。
同理,在find命令中指定min/max時,也必須顯式地指定min/max索引的提示。
在4.0和更早版本中,無論查詢條件如何,您都可以選擇是否顯式地指定min()/max()索引。如果在4.0和更早版本中不顯式指定提示,MongoDB會根據索引的邊界選擇索引;但如果存在多個在相同欄位上但排序次序不同的索引,選擇索引可能會不明確。
CurrentOp
在報告"getmore"操作時,$currentOp彙總階段、currentOp命令以及db.currentOp()現在將originatingCommand欄位作為新cursor欄位的子欄位返回。在之前的版本中,originatingCommand是"getmore"文檔中的頂級欄位。
伺服器狀態
serverStatus和db.serverStatus返回的opcounters和opcountersRepl度量現在變為64位整數(即NumberLong)而不是32位整數(即NumberInt)。
日誌記錄
當記錄到syslog時,訊息文本的格式現在包含組件。例如:
... ACCESS [repl writer worker 5] Unsupported modification to roles collection ...在4.2之前版本中,syslog訊息文本不包含組件。例如:
... [repl writer worker 1] Unsupported modification to roles collection ...從MongoDB 4.2開始,擷取日誌命令會截斷任何包含超過1024個字元的事件。在4.2之前版本中,擷取日誌命令會在512個字元後截斷。
從MongoDB 4.2開始,MongoDB記錄調試記錄層級。例如,如果記錄層級為2,則MongoDB記錄D2。
在4.2之前版本中,MongoDB日誌訊息僅支援指定D表示調試層級。
Wire Protocol
MongoDB不再支援OP_COMMAND和對應的OP_COMMANDREPLY網路通訊協定。
killCursors變更
事務
從MongoDB 4.2開始,事務中的第一個操作不能是killCursors。
許可權
從MongoDB 4.2開始,使用者始終可以終止自己的遊標,無論使用者是否具有killCursors許可權。因此,MongoDB 4.2及以後版本中的killCursors許可權不再生效。
在MongoDB 3.6.3到MongoDB 4.0.x版本,使用者需要killCursors許可權才能在存取控制啟用時終止自己的遊標。
移除了 AsyncRequestsSenderUseBaton 參數
在 MongoDB 4.2及以後版本,MongoDB移除了AsyncRequestsSenderUseBaton參數,並始終啟用該參數控制的效能增強。
更嚴格的 count 語法驗證
從 4.2 版本開始,MongoDB實施了對count命令選項名稱更嚴格的驗證。如果指定未知的選項名稱,命令會報錯。
在4.2之前的版本中,MongoDB會忽略無效的選項名稱。
因果一致性的會話
從MongoDB 4.2開始,以下命令不再支援指定afterClusterTime:
dbHash命令mapReduce命令validate命令
因此,這些操作無法與因果一致性的會話相關聯。
移除了fastmodinsert指標
MongoDB 4.2 移除了已棄用的fastmodinsert指標,不再顯示使用executionStats的Explain結果、查詢分析器輸出等位置。
Map-Reduce
從4.2版本開始,MongoDB棄用以下內容:
分區叢集中使用
map-reduce建立新分區集合的功能,以及使用sharded選項進行map-reduce。要輸出到分區集合,請先建立分區集合。MongoDB 4.2也棄用了替換現有分區集合的功能。Map-Reduce顯式指定
nonAtomic: false選項。
Balencer狀態和自動分割(Autosplit)
從MongoDB 4.2開始:
balancerStart命令和mongo shell協助方法sh.startBalancer()和sh.setBalancerState(true)同時啟用自動分割。如需禁用自動分割,可以使用
sh.disableAutoSplit()。balancerStop命令和mongo shell協助方法sh.stopBalancer()和sh.setBalancerState(false)同時禁用自動分割。如需啟用自動分割,可以使用
sh.enableAutoSplit()。
sh.enableBalancing(namespace)和sh.disableBalancing(namespace)方法不再影響自動分割。
鎖診斷報告
從MongoDB 4.2開始,MongoDB報告ReplicationStateTransition鎖的資訊。
此外,MongoDB 4.2將ParallelBatchWriterMode鎖資訊與全域鎖資訊分開報告。4.2之前的版本會將ParallelBatchWriterMode鎖資訊包含在全域鎖資訊中。
有關報告鎖資訊的操作,請參見:
serverStatus命令和db.serverStatus()方法。$currentOp彙總管道階段、currentOp命令、db.currentOp()方法。
對 findAndModify 的查詢/排序/投影參數的驗證
從MongoDB 4.2(包括 4.0.12+ 和 3.6.14+版本)開始,findAndModify命令及其關聯的mongo shell方法在指定的查詢、排序或投影參數不是文檔時會報錯。
在4.2之前的版本中,如果查詢或排序參數不是文檔,操作會將其視為空白文檔 {}。
dropDatabase 和 movePrimary
從 MongoDB 4.2開始:
如果您刪除一個資料庫並建立具有相同名稱的新資料庫,需要:
重啟所有mongos執行個體和分區成員。
在讀寫該資料庫之前,在所有mongos執行個體和分區成員上執行
flushRouterConfig命令。
如果您使用movePrimary命令移動非分區集合,需要:
重啟所有mongos執行個體和分區成員。
在讀寫該集合之前,在所有mongos執行個體和分區成員上執行
flushRouterConfig命令。
這確保了mongos和分區成員重新整理其中繼資料快取。否則讀取時可能會漏掉資料,寫入時可能不會寫入到正確的分區。如需恢複,請您手動幹預。
在4.2之前的版本中,僅需重啟mongos執行個體或在mongos執行個體上運行flushRouterConfig命令。
移除system.indexes和system.namespaces集合
從 4.2 版本開始,MongoDB移除了system.indexes和system.namespaces集合(已於3.0版本棄用)。
隨著這些集合的移除,內建角色clusterManager、clusterMonitor、dbAdmin、read、restore等以及其他從這些角色繼承的許可權不再授予訪問system.indexes和system.namespaces集合的許可權。
降級 arbiter 需要清除資料目錄
MongoDB 4.2 arbiter資料檔案與MongoDB 4.0不相容。從MongoDB 4.2降級到4.0需要先刪除arbiter資料檔案。使用MongoDB 4.2的資料檔案來運行MongoDB 4.0的arbiter可能會產生錯誤。
分區集合和文檔替換
從MongoDB 4.2開始:
替換文檔的操作(如
replaceOne()或update()與替換文檔配合使用)會首先嘗試使用查詢過濾器將文檔目標定位到單個分區。如果無法通過查詢過濾器定位到單個分區,則嘗試使用替換文檔定位。在4.2之前的版本中,這些操作僅嘗試使用替換文檔定位。MongoDB棄用了
save()方法,請改用insertOne()或replaceOne()方法。save()方法無法用於非_id分區的分區集合,否則會導致錯誤。對於帶有
upsert: true的替換文檔操作,分區集合上必須確保過濾器包含與分區鍵完全符合的等式條件。
4.2 功能相容性
4.2版本中的某些功能不僅需要4.2二進位檔案,還需要功能相容版本(fCV)設定為4.2。這些功能包括:
分散式交易。
移除了MongoDB 4.2及以上版本的索引鍵長限制。同時,
failIndexKeyTooLong參數對fCV設定為4.2及以上版本的MongoDB無效,僅適用於MongoDB 2.6-4.0版本。對MongoDB 4.2及以上版本,移除了索引名稱長度限制。
新的唯一索引內部格式。此新格式適用於所有現有唯一索引以及新建立或重建的唯一索引。
從 MongoDB 4.2開始,使用者無法再將
type:0作為exists:false的同義字使用。MongoDB 4.2新增了萬用字元索引,以支援使用者查詢自訂欄位或集合中大量不同欄位的工作負載。