MongoDB

MongoDB 4.0 での互換性の変更

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を指定することはできません。

インデックスの構築とレプリカセット

--noIndexBuildRetrystorage.indexBuildRetryと、--replSetreplication.replSetNameをともに指定することはできません。
つまりこれは、レプリカセット内のmongodインスタンスに対して--noIndexBuildRetrystorage.indexBuildRetryは使えないということです。

ロールバックに関する制約

MongoDB 4.0では、ロールバックの可能性のあるデータ量に関する制約が無くなりました。以前のバージョンでは、あるmongodインスタンスは300メガバイト以上はロールバックせず、300メガバイト以上ロールバックの必要が生じた場合は手動での操作が必要でした。

シャードクラスタ

以下のシャードクラスタのメタデータに影響するオペレーションに対して、mongos"majority"を使用します。

Command Method Note
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 Feature Compatibility

4.0でのいくつかの機能は、単に4.0のバイナリだけでなく、featureCompatibilityVersion4.0に設定することが必要です。
以下の機能が該当します。

一般的な変更点

  • 地理情報クエリオペレーターの$near$nearSphereは、シャード化されたコレクションに対して問合せすることができるようになりました。

  • createコマンド(およびmongoシェルでのdb.createCollection()メソッド)では、localデータベース以外のデータベース中にコレクションを作成するとき、autoIndexIdオプションをfalseに設定することはできません。

  • 認証が有効になっている場合、listDatabasesコマンドをlistDatabases権限を持っていない状態で実行すると、ユーザーがコマンドを実行していてfind権限を持っているすべてのデータベースの一覧を返します。以前のバージョンでは、listDatabases権限が無い状態でコマンドを実行すると、Unauthorizedレスポンスが返されていました。

  • taskExecutorPoolSizeパラメータのデフォルト値が、0から1に変更されました。Linuxでは、以前の動作に戻すためには、taskExecutorPoolSize0にして、さらにAsyncRequestsSenderUseBatonfalseに設定してください。

  • MongoDB 4.0ではmongodmongosインスタンスに対してtransportLayernet.transportLayerlegacyにセットする機能は削除されました。transportLayerは自動的にasioに設定され、変更はできません。

  • MongoDB 4.0以降では、reIndexコマンドとそのヘルパーであるdb.collection.reIndex()メソッドはGlobal exclusive (W) lockを取得し、処理が完了するまで他のオペレーションをブロックします。

  • yearisoYeartimezone以外のフィールドの値が有効な範囲を超えている場合、$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のサポートが必要な場合は、

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シェルが、authorizedCollectionsnameOnlyオプションをサポートしていない以前のバージョンの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()メソッドが非推奨となりました。

その代替として、以下の方法が可能です。

パラメータ

  • 古いlogUserIdsパラメータが削除されました。代わりに監査機能を利用してください。

$isolatedオペレータ

MongoDBは$isolatedオペレータのサポートを削除しました。$isolatedオペレータを含むpartialインデックスや、$isolatedオペレータを含むviewが存在する場合は、インデックスやviewの定義の中から当該オペレータを外して、アップグレードの前に再作成してください。

$isolatedオペレータの変わりに、トランザクションを使用してください。

geoNearコマンド

MongoDB 4.0では、geoNearコマンドは非推奨となりました。代わりに、以下のいずれかのオペレーションを使用してください。

maxScanオプション

findコマンドのmaxScanオプション、および、mongoシェルのヘルパーcursor.maxScan()は非推奨となりました。代わりに、maxTimeMSオプション、または、ヘルパーのcursor.maxTimeMS()を使用してください。

出力フィールドの変更

代わりに、replSetGetStatus.replSetGetStatus.syncSourceHostreplSetGetStatus.members[n].syncSourceHostを使用してください。