全部產品
Search
文件中心

:MongoDB 4.0相容性更新說明

更新時間:Apr 17, 2025

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

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

移除對MONGODB-CR的支援

從4.0版本開始,MongoDB將不再支援已棄用的MongoDB身分識別驗證機制(MONGODB-CR)。

自3.0版本起,MongoDB不支援建立MONGODB-CR使用者,除非部署是從2.6或更早版本升級而來,且原有MONGODB-CR使用者未升級認證模式。

若您的部署仍使用MONGODB-CR模式儲存使用者憑證,在升級到4.0前必須升級至SCRAM(Salted Challenge Response Authentication Mechanism)。

移除authSchemaUpgrade命令

MongoDB 4.0移除了authSchemaUpgrade命令。該命令在3.0至3.6版本中用於將MONGODB-CR使用者升級為SCRAM使用者

從 db.copyDatabase() 和 copydb 中移除 MONGODB-CR 支援

db.copyDatabase()方法無法從強制使用MONGODB-CR認證的mongod執行個體複製資料。

copydb命令同樣受限。此變更後,MongoDB 4.0移除了copydbgetnonce命令。

棄用MMAPv1

自4.0版本起,MongoDB棄用MMAPv1儲存引擎。若需遷移至WiredTiger儲存引擎。

x.509 認證認證限制

從4.0版本開始,若在使用x.509認證時指定--sslAllowInvalidCertificatesnet.ssl.allowInvalidCertificates: true(MongoDB 4.2起別名改為--tlsAllowInvalidateCertificatesnet.tls.allowInvalidCertificates: true),無效認證僅能建立TLS/SSL串連,不足以完成認證。

您可以更新為有效認證(如通過可信CA簽名),或使用net.ssl.CAFile指定自訂CA來解決問題。

複本集

移除複本集協議版本 pv0

4.0版本移除了已棄用的複本集協議版本0(pv0)。升級前需先升級至pv1,升級操作樣本如下:

cfg = rs.conf();
cfg.protocolVersion=1;
rs.reconfig(cfg);

建議同時調高settings.catchUpTimeoutMillis以減少在w:1的writeConcern配置下發生復原的機率。

移除主從複製

4.0版本不再支援主從複製。若仍在使用此模式,必須轉換為複本集。

日誌與複本集

4.0版本起,使用WiredTiger儲存引擎的複本集成員不可禁用日誌(即禁用--nojournalstorage.journal.enabled: false)。

索引構建和複本集

在使用--replSetreplication.replSetName配置複本集時,您不能指定--noIndexBuildRetrystorage.indexBuildRetry參數。也就是說,對於作為複本集成員的mongod執行個體,無法使用--noIndexBuildRetrystorage.indexBuildRetry

復原限制

4.0版本取消復原資料量上限(原限制為300MB),並引入可配置參數rollbackTimeLimitSecs(預設1天,4.0之前的版本固定為30分鐘)。

分區叢集

mongos在以下影響分區叢集中繼資料的操作中使用"majority"Write Concern。

命令

方法

說明

addShard

sh.addShard()

create

db.createCollection()

drop

db.collection.drop()

dropDatabase

db.dropDatabase()

在MongoDB 3.6中更改。

enableSharding

sh.enableSharding()

movePrimary

renameCollection

db.collection.renameCollection()

shardCollection

sh.shardCollection()

removeShard

setFeatureCompatibilityVersion

4.0功能相容性

4.0版本中的一些功能不僅需要4.0的二進位檔案,還需要將featureCompatibilityVersion設定為4.0。這些功能包括:

  • SCRAM-SHA-256

  • 新的類型轉換運算子(如$toBool$toInt等)和增強功能

  • 多文檔事務

  • $dateToString選項更改

  • 新的變更流方法

  • 更改流恢複令牌資料類型更改

其他變更

  • 分區叢集現支援地理空間查詢運算子$near和 $nearSphere

  • 對於create命令以及mongo shell的db.createCollection()方法,在local資料庫以外的資料庫中建立集合時,不能將選項autoIndexId設定為false

  • 啟用身分識別驗證後,在沒有listDatabases操作許可權的情況下運行listDatabases命令,系統將返回運行該命令的使用者具有find操作許可權的所有資料庫的列表。在之前的版本中,在沒有listDatabases操作許可權的情況下運行命令會返回Unauthorized

  • taskExecutorPoolSize的預設值從0更改為1。在Linux上,若要還原4.0部署的先前行為,請將taskExecutorPoolSize設定為0 ,將AsyncRequestsSenderUseBaton設定為false

  • MongoDB 4.0刪除了將mongod和mongos執行個體的transportLayer以及net.transportLayer設定為legacy的功能。transportLayer設定預設為asio,且無法修改。

  • 從MongoDB 4.0開始,reIndex命令及其db.collection.reIndex()將採用全域獨佔鎖,並將阻止其他動作,直到完成。

  • 如果為yearisoYeartimezone以外的欄位指定的值超出有效範圍,則$dateFromParts將從其他日期部分中減去差值以計算日期。在以前的版本中,超出範圍的值會導致錯誤。

  • 修改了killCursors許可權操作的行為。在MongoDB 4.0之前,如果使用者知道進程的ID,他們可以殺死任何進程。從MongoDB 4.0起,killCursors允許使用者殺死與當前身分識別驗證的使用者關聯的任何進程。如果使用者沒有終止進程的許可權,killCursors將返回錯誤。

  • MongoDB 4.0添加了一個killAnyCursor許可權操作,該操作授予使用者終止指定集合的任何遊標的許可權。

  • 從MongoDB 4.0版本開始,當mongos可執行檔嘗試串連到功能相容性版本(fCV)高於自身版本的mongod執行個體時,該mongos進程將會崩潰。例如,MongoDB 4.0版本的mongos無法串連到將fCV設定為4.2的4.2分區叢集。不過,若該4.2分區叢集的fCV仍保持在4.0,則MongoDB 4.0版本的mongos可以正常串連。

  • 從4.0版本開始,MongoDB按配置解析localhostIP地址,而不是假設為127.0.0.1

cursor.min()和cursor.max()

如果您使用max()min()來指定範圍,則max()指定的邊界必須大於min()指定的邊界。

在之前的版本中,邊界可以相等,但不會掃描索引條目,將返回一個空的結果集。

禁用TLS 1.0

MongoDB 二進位檔案(mongod、mongos 和 mongo)在支援TLS 1.1+ 的系統上會預設禁用TLS 1.0加密支援。

若需強制啟用TLS 1.0支援:

  • mongod 執行個體:在設定檔中設定 net.ssl.disabledProtocols: none,或通過命令列參數 --sslDisabledProtocols none 實現。

  • mongos 執行個體:配置方式與 mongod 相同,使用 net.ssl.disabledProtocols: none 或 --sslDisabledProtocols none

  • mongo Shell:需添加 --sslDisabledProtocols none 參數。

    --sslDisabledProtocols 參數可以在以下mongo Shell版本中使用:

    • MongoDB 4.0+

    • MongoDB 3.6.5+

    • MongoDB 3.4.15+

macOS 系統中,若使用 3.6.4 或更早版本的 mongo Shell 串連 MongoDB 4.0+ 叢集,必須顯式啟用 TLS 1.0。

mongo Shell

show collections

在mongo Shell中,show collections等同於:

db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
  • 對於具備許可權的使用者:顯示資料庫內所有非系統集合的列表。

  • 對於無許可權的使用者:僅顯示其擁有存取權限的集合。

若4.0版本的mongo Shell串連到4.0之前版本且不支援 authorizedCollections 和 nameOnly 參數的MongoDB時:

  • 使用者必須擁有 listCollection 許可權才能執行命令。

  • 無許可權使用者執行時,MongoDB 通過 connectionStatus 返回的 authenticatedUserPrivileges 欄位產生近似結果。

db.getCollectionNames()

在mongo Shell中,db.getCollectionNames()等同於:

db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
  • 對於具有存取權限的使用者,該方法會列出資料庫中所有集合的命令。

  • 對於不具有存取權限的使用者,該方法僅會列出執行該命令的使用者擁有許可權的集合。

刪除了二進位和已棄用的欄位/命令

mongoperf

MongoDB 4.0刪除了mongoperf二進位檔案。

copydb和clone命令

MongoDB 4.0不再支援copydbclone命令,以及mongo Shell的協助函數db.copyDatabase()db.cloneDatabase()

作為替代方案,您可以使用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.*'

參數

刪除已棄用的logUserIds參數。

$isolated運算子

MongoDB不再支援$isolated運算子。如果您有包含$isolated運算子的索引或視圖,請在升級之前重新建立沒有該運算子的索引或視圖。

geoNear命令

MongoDB棄用了geoNear命令,請改用以下命令:

  • $geoNear 彙總階段

  • $near 查詢操作符

  • $nearSphere 查詢操作符

maxScan選項

MongoDB棄用了maxScan和mongo Shell的cursor.maxScan(),請改用maxTimeMS或mongo Shell的cursor.maxTimeMS()

輸出欄位變更

  • replSetGetStatus返回結果中的以下欄位已棄用:

    • replSetGetStatus.syncingTo

    • replSetGetStatus.members[n].syncingTo

    請改用replSetGetStatus.replSetGetStatus.syncSourceHost和 replSetGetStatus.members[n].syncSourceHost

  • $currentOp彙總階段、currentOp 命令以及 db.currentOp() 協助函數在其輸出結果中將不再返回threadId 欄位。

  • serverStatus 的 asserts.warning 欄位固定返回 0