Compatibility Changes in MongoDB 4.0の翻訳です。
原文はMongoDB Documentation Teamによるものです。ライセンスはCC BY-NC-SA 3.0となっています。
MongoDB 4.0 での互換性の変更
以下の4.0での変更は、以前のバージョンのMongoDBとの互換性に影響する可能性があります。
MONGODB-CR
の削除
バージョン4.0では、以前から非推奨だった認証メカニズムMongoDB Challenge-Response (MONGODB-CR
)を削除しました。
バージョン3.0以降は、2.6以前からのアップグレードでない限り、MONGODB-CR
のユーザー新規作成はサポートしていませんでした。
あなたの環境において、MONGODB-CRスキーマの中にユーザーの資格情報が格納されている場合、バージョン4.0にアップグレードする前にSalted Challenge Response Authentication Mechanism(SCRAM)にアップグレードする必要があります。SCRAM
にアップグレードするための情報は、SCRAMへのアップグレードを参照してください。
authSchemaUpgrade
コマンドの削除
MongoDB 4.0ではauthSchemaUpgrade
コマンドが削除されました。
このコマンドはMongoDB 3.0から3.6までに存在し、MONGODB-CR
のユーザーをSCRAM
のユーザーにアップグレードする処理をサポートしていました。
あなたの環境において、MONGODB-CRスキーマの中にユーザーの資格情報が格納されている場合、バージョン4.0にアップグレードする前にSalted Challenge Response Authentication Mechanism(SCRAM)にアップグレードする必要があります。SCRAM
にアップグレードするための情報は、SCRAMへのアップグレードを参照してください。
db.copyDatabase()
とcopydb
におけるMONGODB-CR
の削除
db.copyDatabase()メソッドは、MONGODB-CR
を強制するmongodインスタンスからはコピーすることができません。
copydbコマンドは、MONGODB-CR
を強制するmongodインスタンスからはコピーすることができません。さらにこの変更にともなって、MongoDB 4.0ではcopydbgetnonce
コマンドは削除されました。
MMAPv1非推奨化
バージョン4.0から、MMAPv1ストレージエンジンは非推奨となりました。
MMAPv1ストレージエンジンの環境をWiredTigerストレージエンジンに変更する場合は、以下を参照してください。
x.509認証の証明書の制限
4.0以降、x.509認証を使っていて--sslAllowInvalidCertificates
またはssl.allowInvalidCertificates: true
を指定している場合、無効な証明書は、TLS/SSL接続を確立することはできますが、認証を行うことはできません。
x.509認証において、無効な証明書を使っている場合、有効なものに更新してください。
たとえば、既存の証明書に対して信頼済みCAで署名したり、カスタムCAを使っている場合はそのCAをnet.ssl.CAFileで指定したりするなどです。
レプリカセット
レプリカセットでpv0
の廃止
4.0では、すでに非推奨であったレプリカセットのprotocol version 0 pv0
が廃止されました。
MongoDB 4.0にアップグレードする前に、pv1にアップグレードする必要があります。
pv1
にアップグレードするには、mongoシェルでレプリカセットのプライマリに接続し、以下の手順を行ってください。
cfg = rs.conf();
cfg.protocolVersion=1;
rs.reconfig(cfg);
w:1を指定している場合のロールバックの可能性を減らすために、レプリカセットでsetting.catchUpTimeoutMillisの設定を大きく再設定することもできます。
pv1
について詳細は、Replica Set Protocol Versionを参照してください。
マスタースレーブレプリケーションの廃止
MongoDB 4.0では、すでに非推奨であったマスタースレーブレプリケーションが廃止されました。MongoDB 4.0にアップグレードする前に、あなたの環境でマスタースレーブレプリケーションを使っている場合は、レプリカセットをアップグレードする必要があります。
マスタースレーブレプリケーションを変換するには、Convert a Master-Slave Deployment to a Replica Setを参照してください。
ジャーナリングとレプリカセット
MongoDB 4.0以降では、WiredTigerストレージエンジンを使っているレプリカセットメンバーに対して--nojournalオプションやstorage.journal.enabled: falseを指定することはできません。
インデックスの構築とレプリカセット
--noIndexBuildRetryやstorage.indexBuildRetryと、--replSetやreplication.replSetNameをともに指定することはできません。
つまりこれは、レプリカセット内のmongodインスタンスに対して--noIndexBuildRetryやstorage.indexBuildRetryは使えないということです。
ロールバックに関する制約
MongoDB 4.0では、ロールバックの可能性のあるデータ量に関する制約が無くなりました。以前のバージョンでは、あるmongodインスタンスは300メガバイト以上はロールバックせず、300メガバイト以上ロールバックの必要が生じた場合は手動での操作が必要でした。
シャードクラスタ
以下のシャードクラスタのメタデータに影響するオペレーションに対して、mongosは"majority"を使用します。
4.0
Feature Compatibility
4.0でのいくつかの機能は、単に4.0のバイナリだけでなく、featureCompatibilityVersion
を4.0
に設定することが必要です。
以下の機能が該当します。
一般的な変更点
-
地理情報クエリオペレーターの$nearと$nearSphereは、シャード化されたコレクションに対して問合せすることができるようになりました。
-
createコマンド(およびmongoシェルでのdb.createCollection()メソッド)では、
local
データベース以外のデータベース中にコレクションを作成するとき、autoIndexId
オプションをfalse
に設定することはできません。 -
認証が有効になっている場合、listDatabasesコマンドをlistDatabases権限を持っていない状態で実行すると、ユーザーがコマンドを実行していてfind権限を持っているすべてのデータベースの一覧を返します。以前のバージョンでは、listDatabases権限が無い状態でコマンドを実行すると、
Unauthorized
レスポンスが返されていました。 -
taskExecutorPoolSizeパラメータのデフォルト値が、
0
から1
に変更されました。Linuxでは、以前の動作に戻すためには、taskExecutorPoolSizeを0
にして、さらにAsyncRequestsSenderUseBatonをfalse
に設定してください。 -
MongoDB 4.0ではmongodとmongosインスタンスに対して
transportLayer
とnet.transportLayer
をlegacy
にセットする機能は削除されました。transportLayer
は自動的にasio
に設定され、変更はできません。 -
MongoDB 4.0以降では、reIndexコマンドとそのヘルパーであるdb.collection.reIndex()メソッドはGlobal exclusive (W) lockを取得し、処理が完了するまで他のオペレーションをブロックします。
-
year
、isoYear
、timezone
以外のフィールドの値が有効な範囲を超えている場合、$dateFromPartsは、日付を計算するために、差分を他の部分に繰り上げたり繰り下げたりして反映します。以前のバージョンでは、有効な範囲を超えた値はエラーになっていました。 -
特権操作であるkillCursorsの動作が変更されました。以前のバージョンでは、ユーザーは対象のカーソルのIDを知っていれば、どんなカーソルでもkillすることができました。MongoDB 4.0では、killCursors権限により、現在認証されているユーザーに紐づくあらゆるカーソルをkillする権限が認められます。ユーザーがカーソルをkillする権限を持っていない場合、killCursorsはエラーを返します。
-
MongoDB 4.0では、特定のコレクションのあらゆるカーソルをkillできるkillAnyCursor権限が追加されました。
-
MongoDB 4.0以降では、mongosは、mongodバイナリのバージョンがmongosバイナリのバージョンより大きく、かつ、mongodのfeature compatibility versionがmongosのfeature compatibility versionより大きい場合、mongodインスタンスに接続しようとするとクラッシュします。
cursor.min()
とcursor.max()
範囲を指定するためにmax()メソッドとmin()メソッドを一緒に使っている場合、max()で指定される境界はmin()で指定される境界より大きい必要があります。
以前のバージョンでは、2つの境界は同じでもよかったのですが、ただしインデックスエントリを検索することはなく、常に空の結果セットが返されていました。
TLS 1.0の無効化
MongoDBのバイナリ(mongod, mongos, mongo)で、TLS 1.1以上がサポートされているシステムでは、TLS 1.0のサポートは無効化されました。
TLS 1.0のサポートが必要な場合は、
-
mongodインスタンスについては、net.ssl.disabledProtocolsに
none
を指定するか、--sslDisabledProtocolsにnone
を指定してください。 -
mongosインスタンスについては、net.ssl.disabledProtocolsに
none
を指定するか、--sslDisabledProtocolsにnone
を指定してください。 -
mongoシェルについては、--sslDisabledProtocolsに
none
を指定してください。mongoシェルに対する--sslDisabledProtocolsオプションは、以下のバージョンで有効です。- MongoDB version 4.0+
- MongoDB version 3.6.5+
- MongoDB version 3.4.15+
macOSでは、mongoシェルのバージョン3.6.4またはそれ以前を、MongoDB 4.0以上に接続する場合、明示的にTLS 1.0を有効化する必要があります。
AES-GCM
Windowsにおいて、MongoDB EnterpriseはAES256-GCM
をサポートしなくなりました。
mongo
シェル
show collections
MongoDB 4.0以降のmongoシェルでは、show collections
は以下のコマンドと同じです。
db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true} )
- 必要なアクセス権限を持っているユーザーには、
show collections
はそのデータベースの非システムコレクションの一覧を返します。 - 必要なアクセス権限を持っていないユーザーには、
show collections
はそのユーザーが権限を持っているコレクションの一覧のみを返します。
バージョン4.0のmongoシェルが、authorizedCollections
とnameOnly
オプションをサポートしていない以前のバージョンのMongoDBに接続されているときは、
- ユーザーはlistCollectionを実行するために必要な権限を持っている必要があります。
- 必要な権限を持っていないユーザーが
show collections
を実行した場合、MongoDBはconnectionStatusにより返されるauthenticatedUserPrivilegesフィールドを使って、おおまかなコレクションの一覧を返します。
db.getCollectionNames()
4.0以降のmongoシェルでは、db.getCollectionNames()は以下のコマンドと同じです。
db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
- 必要なアクセス権限(データベースに対してlistCollectionsアクションを認める権限)を持っているユーザーには、データベース中のすべてのコレクションの一覧を返します。
- 必要なアクセス権限を持っていないユーザーには、ユーザーが権限を持っているコレクションの一覧のみを返します。たとえば、データベースの中であるコレクションに対するfind権限を持っている場合、そのコレクションのみが返されます。
バイナリの削除および非推奨化されたフィールド/コマンド
mongoperf
MongoDB 4.0ではmongoperf
バイナリは削除されました。
copydb
およびclone
コマンド
MongoDB 4.0ではcopydbおよびcloneコマンドと、それらのmongoシェルでのヘルパーであるdb.copyDatabase()メソッド、db.cloneDatabase()メソッドが非推奨となりました。
その代替として、以下の方法が可能です。
- mongodumpとmongorestoreを使うか、ドライバを使ってスクリプトを作成します。
パラメータ
- 古い
logUserIds
パラメータが削除されました。代わりに監査機能を利用してください。
$isolated
オペレータ
MongoDBは$isolated
オペレータのサポートを削除しました。$isolated
オペレータを含むpartialインデックスや、$isolated
オペレータを含むviewが存在する場合は、インデックスやviewの定義の中から当該オペレータを外して、アップグレードの前に再作成してください。
$isolated
オペレータの変わりに、トランザクションを使用してください。
geoNear
コマンド
MongoDB 4.0では、geoNearコマンドは非推奨となりました。代わりに、以下のいずれかのオペレーションを使用してください。
-
$geoNear aggregationステージ
-
$near クエリオペレータ
-
$nearSphere クエリオペレータ
maxScan
オプション
findコマンドのmaxScan
オプション、および、mongoシェルのヘルパーcursor.maxScan()は非推奨となりました。代わりに、maxTimeMS
オプション、または、ヘルパーのcursor.maxTimeMS()を使用してください。
出力フィールドの変更
-
replSetGetStatusから返される以下のフィールドは非推奨となりました。
代わりに、
replSetGetStatus.replSetGetStatus.syncSourceHost
とreplSetGetStatus.members[n].syncSourceHostを使用してください。 -
$currentOpaggregationステージ、currentOpコマンド、db.currentOp()ヘルパーの出力から、
threadId
フィールドが削除されました。 -
serverStatusコマンドの出力のasserts.warningフィールドは、常に
0
となりました。