全部產品
Search
文件中心

:MongoDB 4.2相容性更新說明

更新時間:Apr 17, 2025

本文介紹MongoDB 4.2版本的相容性變化。

如需查看MongoDB官網相容性更新說明文檔,請前往MongoDB官網下載

移除MMAPv1儲存引擎

MongoDB 4.2刪除了對MMAPv1儲存引擎的支援。

如果您在4.0版本使用了MMAPv1儲存引擎,請在升級到4.2版本前將儲存引擎更改為WiredTiger儲存引擎。

MMAPv1特定配置選項

MongoDB刪除了以下MMAPv1特定的配置選項:

刪除的配置

刪除的命令列

storage.mmapv1.journal.commitIntervalMs

storage.mmapv1.journal.debugFlags

mongod --journalOptions

storage.mmapv1.nsSize

mongod --nssize

storage.mmapv1.preallocDataFiles

mongod --noprealloc

storage.mmapv1.quota.enforced

mongod --quota

storage.mmapv1.quota.maxFilesPerDB

mongod --quotaFiles

storage.mmapv1.smallFiles

mongod --smallfiles

storage.repairPath

mongod --repairpath

replication.secondaryIndexPrefetch

mongod --replIndexPrefetch

說明

從4.2版本開始,MongoDB將不再使用上述配置和命令。如果您使用了WiredTiger部署,請刪除MMAPv1的配置選項。

MMAPv1特定參數

MongoDB刪除了以下MMAPv1參數:

  • newCollectionsUsePowerOf2Sizes

  • replIndexPrefetch

MMAPv1特定命令

MongoDB刪除了MMAPv1特定的touch命令。

命令和方法的MMAPv1特定選項

MongoDB刪除了MMAPv1的特定選項:

  • collMod命令的noPaddingusePowerOf2Sizes

  • collStats命令的verbose

  • create命令的flags

  • db.createCollection()命令的paddingFactorpaddingBytespreservePadding

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 資料庫,您可以:

  1. 用於mongodumptest資料庫轉儲到歸檔檔案mongodump-test-db

    mongodump --archive="mongodump-test-db" --db=test
  2. 使用mongorestore搭配--nsFrom--nsTo參數從存檔中恢複。

    mongorestore --archive="mongodump-test-db" --nsFrom='test.*' --nsTo='examples.*'
說明

您可以按需添加參數,例如 --uri--host--username 等。

您也可以不使用封存檔案,通過 mongodumptest資料庫連接到標準輸出資料流,並通過管道傳遞到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命令返回結果中包含avgDistancemaxDistance

    你可以使用彙總管道在geoNear階段之後使用group階段來返回avgDistancemaxDistance

    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()

請改用mongoexportmongoimport命令,或編寫一個使用驅動的指令碼。

棄用 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階段,要查看executionStatsallPlansExecution資訊,請在不包含out階段的情況下運行explain,以便返回前面階段的explain結果。

或者,您可以在包含$out階段的彙總階段中以queryPlanner模式運行explain

$out 和 Majority Read Concern層級

從 MongoDB 4.2 開始,您可以在包含$out階段的彙總操作中指定Read Concern層級為"majority"

$geoNear移除了limit和num選項

從MongoDB 4.2開始,MongoDB刪除了$geoNearlimitnum選項,以及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(寬鬆模式)輸出。

如果指定--jsonFormatcanonical,則mongoexport產生擴充JSON v2.0(規範模式)輸出。

mongoimport

預設期望匯入的資料為擴充JSON v2.0(寬鬆或規範模式)。

如果指定--legacy選項, mongoimport可以識別擴充JSON v1.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上運行reIndexdb.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"文檔中的頂級欄位。

伺服器狀態

serverStatusdb.serverStatus返回的opcountersopcountersRepl度量現在變為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.indexessystem.namespaces集合(已於3.0版本棄用)。

隨著這些集合的移除,內建角色clusterManagerclusterMonitordbAdminreadrestore等以及其他從這些角色繼承的許可權不再授予訪問system.indexessystem.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新增了萬用字元索引,以支援使用者查詢自訂欄位或集合中大量不同欄位的工作負載。