すべてのプロダクト
Search
ドキュメントセンター

:MongoDB 3.6 の互換性の変更

最終更新日:Apr 16, 2025

このトピックでは、MongoDB 3.6 の互換性の変更について説明します。

MongoDB の公式の互換性変更ドキュメントを参照するには、[従来のドキュメント] にアクセスしてください。

ローカルホストバインディングの互換性の変更

MongoDB 3.6 以降、mongod および mongos バイナリファイルはデフォルトでローカルホストにバインドされます。構成ファイルで net.ipv6 パラメーターが設定されている場合、または --ipv6 コマンドラインオプションによって IPv6 サポートが有効になっている場合、これらのバイナリファイルはローカルホストの IPv6 アドレスにバインドされます。

MongoDB 2.6 以降、公式の MongoDB RPM パッケージ(Red Hat、CentOS、Fedora Linux、およびそれらの派生物用)と DEB パッケージ(Debian、Ubuntu、およびそれらの派生物用)のバイナリファイルのみが、デフォルトでローカルホストにバインドされます。

ローカルホストのみにバインドされている場合、MongoDB 3.6 バイナリファイルは、同じマシン上のクライアント(mongo シェル、レプリカセットインスタンスのメンバー、またはシャードクラスターインスタンスのノードを含む)からの接続のみを受け入れます。リモートクライアントは、ローカルホストのみにバインドされているバイナリファイルに接続できません。

デフォルトの動作をオーバーライドし、バイナリファイルを他の IP アドレスにバインドするには、構成ファイルの net.bindIp パラメーター、または --bind_ip コマンドラインオプションを使用して、ホスト名または IP アドレスのリストを指定します。

重要

非ローカルホスト(公開アクセス可能な IP アドレスなど)にバインドする前に、不正アクセスからクラスターを保護していることを確認してください。クラスターを保護するには、認証を有効にし、ネットワークインフラストラクチャを強化します。

たとえば、次の mongod インスタンスは、ローカルホストとホスト名 My-Example-Associated-Hostname にバインドされています。ホスト名は IP アドレス 198.51.100.1 に関連付けられています。

mongod --bind_ip localhost,My-Example-Associated-Hostname

このインスタンスに接続するには、リモートクライアントはホスト名または関連付けられた IP アドレス 198.51.100.1 を指定する必要があります。

mongo --host My-Example-Associated-Hostname

mongo --host 198.51.100.1

シャードクラスターインスタンス

MongoDB 3.6 以降、シャードはレプリカセットアーキテクチャを使用する必要があります。シャードクラスターインスタンスを MongoDB 3.6 にアップグレードするには、すべてのシャードサーバーをレプリカセットとして実行する必要があります。

HTTP API および REST API

MongoDB 3.6 以降のバージョンでは、HTTP API および REST API は削除されています。

構成

mongod/mongos オプション

net.http.enabled

httpinterface

net.http.JSONPEnabled

nohttpinterface

net.http.port

jsonp

net.http.RESTInterfaceEnabled

rest

ツールの更新

MongoDB 3.6 では、mongooplog ツールが削除されています。

配列操作の互換性の変更

$type: "array" の動作の変更

MongoDB 3.6 以降、type: "array" 式と $type: 4 式は、任意の要素タイプを含む配列フィールドと一致します。

MongoDB 3.6 より前では、$type: "array" は、ネストされた配列を含む配列フィールドとのみ一致します。

たとえば、c という名前のコレクションに次のドキュメントが含まれているとします。

{ "_id": 1, "a": [ 1, 2, 3 ] },
{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

次の操作は、フィールド a のタイプによってデータをクエリします。

db.c.find( { "a": { $type : "array" } } )

MongoDB 3.6 以降、$type クエリはコレクション内の 2 つのドキュメントを返します。これは、クエリがフィールド a が配列であることを検出するようになったためです。

{ "_id": 1, "a": [ 1, 2, 3 ] },
{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

MongoDB 3.4 より前では、$type クエリは、フィールド a に BSON 配列タイプの要素が含まれるドキュメントのみを返します。

{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

現在のインスタンスで MongoDB 3.4.x を実行していて、partialFilterExpression$type: "array" または $type: 4 が含まれる部分インデックスを使用している場合は、MongoDB 3.6 にアップグレードした後にこれらのインデックスを再構築する必要があります。これにより、$type: 'array' のセマンティックな変更による競合を回避できます。

配列ソート動作の変更

MongoDB 3.6 以降、配列フィールドでソートする場合、MongoDB は昇順ソートキーに最小値の配列要素を、降順ソートキーに最大値の配列要素を使用します。ソートは、ソートキーとして配列要素を選択するときに、クエリ述語を考慮しなくなりました。この動作の変更は、find コマンドと集約パイプライン操作に適用されます。

その結果、配列フィールドでソートするアプリケーションは、異なるソート結果を返す可能性があります。

説明

MongoDB 4.4 で配列フィールドによるソート動作がさらに調整された結果、マルチキーインデックスを持つ配列フィールドでソートする場合、次の場合を除き、クエリプランにはブロッキングソートステージが含まれます。

  • すべてのソートフィールドのインデックス境界が [MinKey, MaxKey] である。

  • マルチキーインデックス付きフィールドの境界に、ソートパターンと同じパスプレフィックスを持つものがない。

find メソッドのソート動作の変更

MongoDB では、ソートキーは、MongoDB がソートプロセス中に配列フィールドを持つドキュメントを比較するために使用する配列要素です。昇順ソートでは、最小値のソートキーを持つ配列を含むドキュメントが最初に順序付けられます。降順ソートでは、最大値のソートキーを持つ配列を含むドキュメントが最初に順序付けられます。

バージョン間のソート動作の違い:

  • MongoDB 3.4 より前:配列フィールドのソートは、ソートキーを決定するときにクエリ述語を考慮します。

  • MongoDB 3.6 以降:配列フィールドのソートは、ソートキーを決定するときにクエリ述語を考慮しなくなりました。代わりに、ソートキーは配列内の最小値または最大値の要素になります。

アプリケーションが MongoDB 3.6 にアップグレードされ、配列フィールドでソートし、クエリ述語を使用する場合、ソートロジックが動作の変更の影響を受けているかどうかを確認し、互換性を確保するためにコードを調整する必要があります。

例:

coll という名前のコレクションに次のドキュメントが含まれているとします。

{ _id: 0, a: [-3, -2, 2, 3] }
{ _id: 1, a: [ 5, -4 ] }

配列フィールド a に対してクエリとソート操作を実行します。

db.coll.find({a: {$gte: 0}}).sort({a: 1});
  • MongoDB 3.6 では、ソートキーは配列内の最小値の要素です(クエリ述語は無視されます)。

    • _id: 0 のドキュメントの配列 a の最小値の要素は -3 です。

    • _id: 1 のドキュメントの配列 a の最小値の要素は -4 です。

    次の結果が昇順で返されます。

    { "_id" : 1, "a" : [ 5, -4 ] }
    { "_id" : 0, "a" : [ -3, -2, 2, 3 ] }
  • MongoDB 3.4 より前では、ソートキーはクエリ述語 {$gte: 0} に一致する最小値の要素です。

    • _id: 0 のドキュメントの一致する要素は [2, 3] であり、最小値の要素「2」がドキュメントのソートキーとして使用されます。

    • _id: 1 のドキュメントの一致する要素は [5] であり、最小値の要素「5」がドキュメントのソートキーとして使用されます。

    次の結果が昇順で返されます。

    { _id: 0, a: [-3, -2, 2, 3] }
    { _id: 1, a: [ 5, -4 ] }

集約メソッドのソート動作の変更

MongoDB 3.6 以降、db.collection.aggregate() を使用して配列フィールドでソートする場合、配列内の 1 つの要素のみがソートキーとして使用されます。

例:

// ドキュメント。
{ "_id" : 1, "timestamps" : [ ISODate("2017-07-15T15:31:01Z"), ISODate("2017-07-21T18:31:01Z") ] }
{ "_id" : 0, "timestamps" : [ ISODate("2017-07-21T15:31:01Z"), ISODate("2017-07-21T13:31:01Z") ] }

// クエリ。
db.c.aggregate([{$sort: {timestamps: -1}}])

MongoDB 3.6 では:

  • 降順ソートの場合、配列内の最新の時間がソートキーとして使用されます。

    • _id: 0 のドキュメントの 7 月 21 日午後 3 時 31 分、および

    • _id: 1 のドキュメントの 7 月 21 日午後 5 時 31 分。

  • ソートは降順です。したがって、これらのキーは最新から最も古い順に順序付けられ、_id: 1 のドキュメントが _id: 0 のドキュメントの前にソートされます。

MongoDB 3.6 より前では、集約ソートのソートキーとして配列全体が使用されます。配列ソートキーは要素ごとに比較され、結果セットのソート順序が決定されます。

// ドキュメント。
{_id: 0, a: [3, 1, 5]}
{_id: 1, a: [3, 4, 0]}

// クエリ。
db.coll.aggregate([{$sort: {a: 1}}])

MongoDB 3.6 より前では、ソートキーはそれぞれ [3,1,5][3,4,0] です。

  • 2 つのキーの最初の配列要素は同じです(3)。次に、2 番目の配列要素が比較されます(1 < 4)。

  • その結果、_id: 0 のドキュメントが _id: 1 のドキュメントの前にソートされます。

集約パイプラインでの複数の配列フィールドに対する複合ソートの制限

MongoDB 3.6 以降、集約パイプラインでソートする場合、MongoDB はソートファイルに並列配列を含むドキュメントをソートできなくなりました。配列は、BSON オブジェクトの兄弟要素である場合、並列と見なされます。次の状況では、配列は並列とは見なされません。

  • ソートキーに、階層関係を持つフィールドパスなどのネストされた配列が含まれている。

  • ソートキーが同じ配列をパスプレフィックスとして共有している。

説明

これらの制限は、find コマンドには常に存在していました。ただし、MongoDB 3.6 以降のバージョンでは、findaggregate は同じセマンティクスを共有します。

  • 例 1:ネストされた配列が存在する場合、ソートは成功します。

    コレクションに次のドキュメントが含まれているとします。

    {a: [ {b: [1, 2]}, {b: [3, 4]} ]}

    次の集約操作を実行します(ソートキーはネストされた配列フィールドです)。

    db.coll.aggregate([{$sort: {"a.b": 1}}])

    操作は成功します。これは、a.b がネストされた配列フィールドであり、並列配列を構成しないためです。

  • 例 2:ソートキーが同じ配列をプレフィックスとして共有している場合、ソートは成功します。

    コレクションに次のドキュメントが含まれているとします。

    {a: [{b: 1, c: 1}, {b: 2, c: 2}]}

    次の集約操作を実行します(ソートキーは同じ配列をプレフィックスとして共有します)。

    db.coll.aggregate([{$sort: {"a.b": 1, "a.c": 1}}])

    操作は成功します。これは、a.ba.c がプレフィックス a を共有しており、並列配列とは見なされないためです。

  • 例 3:兄弟ソートキーが原因でソートが失敗します。

    コレクションに次のドキュメントが含まれているとします。

    { _id: 1, a: [ 1, 2 ], b: [ 1, 2 ]}
    { _id: 2, a: [ -3, 5 ], b: 0 }
    { _id: 3, a: [ -6, 12 ], b: 100 }

    次の集約操作を実行します(ソートキーは兄弟配列フィールドです)。

    db.coll.aggregate([ { $sort: {a: 1, b: 1} } ])

    MongoDB は a フィールドと b フィールドの両方でソートできません。これは、それらが兄弟配列であり、_id: 1 のドキュメントで並列配列を構成するためです。複数の配列フィールドで複合ソートを実行するには、ソートフィールドがネストされた配列であるか、同じ配列をプレフィックスとして共有していることを確認し、データモデルで兄弟フィールドに配列タイプを使用しないようにしてください。

更新操作の更新

新しいフィールドの更新

MongoDB 3.6 以降、更新操作中に追加されたフィールドは、辞書式順序で追加されます。

たとえば、coll という名前のコレクションに次のドキュメントが含まれているとします。

{ _id: 0, x: 0 }

更新操作を実行して、次のフィールドを追加します。

db.coll.update({_id: 0}, {$set: {b: 0, a: 0}})

MongoDB 3.6 では、新しいフィールドは辞書式順序で追加されます。したがって、更新されたドキュメントは {_id: 0, x: 0, a: 0, b: 0} です。

MongoDB 3.6 より前では、新しいフィールドは更新ドキュメントでの出現順に追加されます。したがって、更新されたドキュメントは {_id: 0, x: 0, b: 0, a: 0} です。

arrayFilters 識別子構文と競合するフィールド

MongoDB 3.6 以降、arrayFilters 識別子構文($[] など)と競合する名前のフィールドは更新できなくなりました。

たとえば、coll という名前のコレクションに次のドキュメントが含まれているとします。

{ _id: 0, x: { "$[]": 0 } }

更新操作を実行します。

db.coll.update({_id: 0}, {$set: {"x.$[]": 1}})

MongoDB 3.6 以降、更新操作は成功します。MongoDB 3.6 では、フィールド名 $[]arrayFilters 識別子構文と競合するため、更新操作は失敗します。

説明

この新しい更新動作は、featureCompatibilityVersion が 3.6 に設定されている場合にのみ適用されます。

$pop 演算子のより厳密な検証

MongoDB 3.6 以降、$pop 演算子のパラメーターは、次のいずれかの値に設定する必要があります。

  • -1:配列の最初の要素を削除します。

  • 1:配列の最後の要素を削除します。

MongoDB 3.6 より前:

  • 負の数:配列の最初の要素を削除します。

  • 負でない数または数値以外の値:配列の最後の要素を削除します。

$pushAll 演算子の削除

MongoDB 3.6 では、$pushAll 演算子(MongoDB 2.4 以降非推奨)が削除されています。

代わりに、$push 演算子と $each 演算子を使用してください。例:

db.students.update(
   { name: "joe" },
   { $push: { scores: { $each: [ 90, 92, 85 ] } } }
)

プラットフォームサポートの変更

  • MongoDB 3.6 は、Window Server 2008 R2 および Windows 7 より前の Windows バージョンをサポートしなくなりました。

  • MongoDB 3.6 は、macOS 10.13 以降の新しいファイルシステムである APFS ではテストされておらず、互換性の問題が発生する可能性があります。

一般的な互換性の更新

MONGODB-CR 認証メカニズムの非推奨化

MongoDB 3.6 以降のバージョンでは、MONGODB-CR 認証メカニズムは非推奨です。まだ行っていない場合は、MONGODB-CR 認証スキーマを SCRAM にアップグレードしてください。

アービターノードとその優先順位

すべてのアービターノードの優先順位は 0 に固定されています。

マスタースレーブレプリケーションアーキテクチャの非推奨化

MongoDB 3.6 は、マスタースレーブレプリケーションアーキテクチャを正式に非推奨とします。

WiredTiger ストレージエンジンでの --nojournal オプションの非推奨化

MongoDB 3.6 は、WiredTiger ストレージエンジンを使用するレプリカセットメンバーの --nojournal オプションを非推奨とします。これにより、データリスクを回避できます。

aggregate コマンドとその出力の調整

MongoDB 3.6 以降、aggregate コマンドは単一のドキュメントとして結果を返さなくなりました。

aggregate コマンドを実行するときは、次のいずれかのオプションを指定する必要があります。

  • cursor:結果をカーソルとして返します(大規模なデータセットに適しています)。

  • explain:集約パイプラインの実行計画の分析を返します。

mongo シェルで db.collection.aggregate() を使用するか、ドライバーで同等のメソッドを使用することをお勧めします。explain オプションが使用されていない限り、これらのメソッドはデフォルトでカーソルを返します。

集約式の日付フィールドから文字列への変換の変更

MongoDB 3.6 以降、MongoDB は、集約式で日付をミリ秒精度を含み、文字 'Z'(UTC タイムゾーンを示す)で終わる文字列に強制的に変換します。

例:

// ドキュメント。
{_id: 0, d: ISODate("2017-10-18T20:04:27.978Z")}
{_id: 1, d: ISODate("2017-10-18T20:04:28.192Z")}

// クエリ。
db.coll.aggregate({$project: {d: {$toLower: "$d"}}})

MongoDB 3.6 より前では、2 つのドキュメントのデータフィールドは、"2017-10-18t20:04:27" および "2017-10-18t20:04:28" 形式の文字列として返されます。

MongoDB 3.6 以降、2 つのドキュメントのデータフィールドは、"2017-10-18t20:04:27.978z" および "2017-10-18t20:04:28.192z" 形式(ミリ秒と小文字の 'z' を含む)の文字列として返されます。

この変更は、次の集約演算子に適用されます。

  • $concat

  • $substr

  • $substrBytes

  • $substrCP

  • $strcasecmp

  • $toLower

  • $toUpper

ログ診断コマンドとオプションの削除

MongoDB 3.6 は、非推奨の diagLoggingmongod --diaglog オプションを削除します。

代わりに、mongoreplay ツールを使用して、MongoDB デプロイメントに送信されたコマンドをキャプチャ、再生、および分析します。

validate 操作の変更

MongoDB 3.6 以降、validate 操作は、ディスクデータの検証を実行する前にのみ、チェックポイントを強制的にトリガーし、すべてのインメモリデータをディスクにフラッシュします。

MongoDB 3.6 より前では、使用される検証モードに関係なく、チェックポイントが強制的にトリガーされます。

validate コマンドまたは db.collection.validate() メソッドを使用する場合は、完全な検証を実行するために {full: true} を明示的に指定します。

インデックス名の制限

MongoDB 3.6 以降:

  • インデックスの作成中に、インデックス名として * を指定することはできません。

  • * という名前のインデックスを削除するためにインデックスキーを使用することはできません。代わりに、インデックス名 * を使用してインデックスを削除します。

MongoDB 3.6 にアップグレードする前に、次のことを行う必要があります。

  • インデックスの削除:* という名前の既存のインデックスをすべて手動で削除します。

  • インデックスの名前変更:インデックスを保持するには、インデックスを削除し、新しい名前で再構築します。

非推奨のオプション

MongoDB 3.6.1 の変更点:

  • snapshot クエリオプションが非推奨になりました。

    • MMAPv1 ストレージエンジン:代わりに hint({ _id: 1 }) を使用して、中間書き込みによってドキュメントが移動された場合でも、クエリ中にドキュメントが複数回返されないようにします。

    • その他のストレージエンジン(WiredTiger など):代わりに hint({ $natural: 1 }) を使用します。

  • $isolated 演算子が非推奨になりました。

    • 代替:トランザクションを使用するか、読み取りコンサーンレベルを調整して分離を実現します。

以降のバージョンと互換性のない機能

MongoDB 3.6 の次の新機能では、featureCompatibilityVersion を "3.6" に設定する必要があります。

  • コレクションの UUID:各コレクションには一意の識別子があります。

  • $jsonSchema ドキュメント検証:JSON Schema 形式でのドキュメント構造検証をサポートします。

  • Change Streams:データ変更イベントをリアルタイムで監視します。

  • チャンク対応セカンダリ:シャードクラスターインスタンスのセカンダリノードでのデータ同期を最適化します。

  • ビュー定義、ドキュメントバリデーター、および部分インデックスフィルター:MongoDB 3.6 の新しいクエリ機能を使用する場合は、この構成を有効にする必要があります。

  • セッションと再試行可能な書き込み:トランザクションセッションと書き込み操作の自動再試行をサポートします。

  • ユーザーとロールの認証制限:ユーザー権限をきめ細かく管理します。

featureCompatibilityVersion のデフォルト値:

  • MongoDB 3.6 の新規デプロイ: "3.6"

  • MongoDB 3.4 からアップグレードされたデプロイメント: "3.4"setFeatureCompatibilityVersion を使用する必要があります)。

db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) コマンドを使用して、現在の featureCompatibilityVersion 値を表示できます。

MongoDB 3.6 からダウングレードするには、セッション、変更ストリーム、およびコレクションの UUID に関連する永続データを含む、互換性のないすべてのデータをクリアする必要があります。