AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

MongoDB 9.0での互換性の変更

このページでは、 MongoDB 9.0 で導入された、古いバージョンのMongoDBとの互換性に影響を与える可能性のある変更について説明します。

非推奨
説明

prefixPreview, suffixPreview, substringPreview

MongoDB 9.0 以降、textアルゴリズムを使用する prefixPreview、suffixPreview、substringPreview クエリタイプは非推奨となり、削除されました。代わりに、stringアルゴリズムで prefix、suffix、または substring クエリタイプを使用してください。

fleDisableSubstringPreviewParameterLimits

MongoDB 9.0 の暗号化されたフィールドに対する部分文字列クエリの内部制限を上書きすることはできません。

MongoDB9.0 以降、アキュムレータ式のフィールド名が空の場合、 ステージはエラーを返します。詳細については、「$group 空のフィールド名 $group の制限 」を参照してください。

MongoDB9.0 以降では、オプションが明示的に設定されている場合、$queryStats コマンドのaggregate キーにはallowPartialResults オプションが含まれます。次に、クエリ統計により、allowPartialResults が省略されているリクエスト、明示的なtrue 、明示的なfalse のリクエストを区別できます。

この追加により、allowPartialResults を設定する aggregate クエリの key と keyHash の直列化が変更されます。 queryShapeHash は変更されていません。 keyHash に一致する下流の利用者では、これらのクエリで異なる値が観察される可能性があります。

詳細については、「 集計コマンドクエリシェイプ 」を参照してください。

MongoDB9.0 以降、null 以外の値に解決されないドット付きパスはnull として評価されます。新しい動作は、パス内のフィールドに空の配列、スカラー値の配列、またはネストされた配列を含む配列が含まれている場合に適用されます。以前のバージョンでは、これらのパスはnull として評価されず、$exists と一致しない結果が生成されていました。

以下のドキュメントを含むコレクション を考慮します:

{ _id: 1, a: [ 1 ] }
{ _id: 2, a: [ ] }

パス a.b はいずれのドキュメントでも null 以外の値に解決されません。 MongoDB 9.0 以降では、{ "a.b": null } クエリは両方のドキュメントに一致します。以前のバージョンでは、クエリはいずれのドキュメントにも一致しませんでした。 { "a.b": { $ne: null } } クエリは逆の結果を返します。MongoDB 9.0 では、クエリはいずれのドキュメントにも一致しず、以前のバージョンでは両方に一致しました。

MongoDB はネストされた配列を走査しないため、配列である要素はパスの残りの部分を解決することはありません。以下のドキュメントを含むコレクションを考慮します:

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

_id: 3 内の各 b 値と _id: 4 内の 2 の b 値はネストされた配列内にあるため、パス a.b はそれらに到達しません。 MongoDB 9.0 以降では、{ "a.b": null } クエリは両方のドキュメントに一致し、{ "a.b": { $ne: null } } クエリはいずれにも一致しません。以前のバージョンでは、{ "a.b": null } クエリはいずれのドキュメントにも一致しませんでした。ネストされた配列により、2 番目の要素は a.b を null 以外の値 3 に解決しても、_id: 4 は { "a.b": null } と一致します。

新しい動作は、null $eq$ne$in、 、$nin 、$gte 、 、$lte 演算子を使用する との比較に影響します。$lookup ステージでの等価一致は、同じセマンティクスに従います。

MongoDB9.0 $lookupにアップグレードする前に、null { $ne: null }へのドット パスを比較するクエリと ステージを確認してください。パス内のフィールドに空の配列、スカラー値の配列、またはネストされた配列を含む配列が含まれている場合、これらのクエリはアップグレード後に異なる結果セットを返します。ドットパスが存在し、かつnull ではないドキュメントを検索する場合、 を使用するクエリでは返されるドキュメントが少なくなり、{ $eq: null } を使用するクエリではより多くのドキュメントが返されます。

MongoDB9.0 以降では、フィールドを参照するクエリが実行中中にインデックス付きフィールドが マルチキーフィールドになると、そのクエリはQueryKilledError の付与で失敗する可能性があります。インデックスフィールドは、ドキュメントを挿入または更新して、フィールドに配列値を含むようにマルチキーになります。

このエラーでクエリが失敗した場合は、挿入または更新操作が完了した後にクエリを再実行してください。

MongoDB9.0 以降では、レプリカセットの選挙によって変更ストリームのロールの読み込み設定readPreference primarysecondaryInterruptedDueToReplStateChange(read11602 getMorepreference)が満たされないようにします。以前のバージョンでは、カーソルは同じノードから結果を返し続けました。

コンプライアンス ドライバーとmongos は、最後の再開トークンから自動的に再開されます。手動getMore ループと はmongosh resumeAfterで再開する必要があります。詳細については、「 変更ストリームの再開 」を参照してください。

MongoDB9.0 以降、2 dsphereインデックスのキー抽出に失敗すると、 510(GeoKeyExtractionFailed )および511 (GeoKeyExtractionFailedTimeseries )という名前のエラー コードが返されます。これらのコードは、通常の16755 167562dsphere インデックスでは以前のアサーション コード183934 と183493 を、時系列コレクションの場合は と を置き換えます。アプリケーションが以前のコードで一致する場合は、510 と511 が一致するように更新します。

MongoDB9.0 以降では、レプリカセット上の異なるデータベース間でコレクションの名前を変更すると、renameCollection コマンドはソース コレクションとターゲット コレクションに対して排他ロックを保持します。ロックは操作全体で残り、DDL 操作と両方のコレクションへの書込みをブロックします。ほとんどの読み取り操作はロックフリーの読み取りを使用するため、ブロックされません。

以前のバージョンでは、 が名前変更を完了する前にソース コレクションのロックが解放されていました。そのウィンドウ中にソースコレクションへの同時書込み (write)renameCollection が失われる可能性があります。

この変更はレプリカセットにのみ影響します。シャーディングされたクラスターは、名前変更中に両方のコレクションをすでにロック。

MongoDB9.0 以降、サーバーサイドJavaScript は、Date ホストmongod タイムゾーンに関係なく、ローカル 操作を UTC$function で評価する WebAssumely(WASL)ベースのエンジンで実行されます。以前のバージョンでは、これらの操作はホスト$accumulator タイムゾーンを監視していました。この変更は、 、 、 、$where mapReduceで実行されるJavaScriptに影響します。

保存されたBSON日付値は変更されません。Date.prototype.getTime()、Date.prototype.toISOString()、getUTC*() メソッドなどの UTC 操作も変更されません。この違いはローカル時間の操作に影響します。

  • Date.prototype.toString()

  • Date.prototype.toTimeString()

  • Date.prototype.getHours() およびその他のローカル getter

  • ローカル Date コンストラクターとセッター

  • 日付を暗黙的に string に変換する操作(コンパレータなしで呼び出される Array.prototype.sort() を含む)

で実行される での次の操作を検討してください。mongodTZ=America/New_York

db.events.insertOne( {
name: "before-opening",
occurredAt: ISODate("2024-01-15T13:30:00Z")
} )
db.events.find( {
$expr: {
$function: {
body: function(date) { return date.getHours() < 9; },
args: [ "$occurredAt" ],
lang: "js"
}
}
} )

以前のバージョンでは、13:30 UTC はニューヨークでは 08:30 であるため、getHours() は 8 を返し、クエリはドキュメントと一致します。 MongoDB 9.0 以降、getHours() は 13 を返し、クエリは一致しません。保存された日付が有効のままであるため、操作は両方のバージョンで成功し、その差はエラーとして報告されません。混合バイナリ バージョンを実行する配置では、同じJavaScriptに対して異なる結果が返される場合があります。

MongoDB9.0 にアップグレードする前に、 、 、$function $accumulator$where、mapReduce コードのJavaScriptを確認して、ローカルDate の使用方法を確認し、 ホスト タイムゾーンに依存しないようにしてください。mongod 。

名前付きタイムゾーンで日付を評価するには、 JavaScriptの代わりに明示的な timezone 引数を持つ集計日付演算子を使用します。次のクエリは、すべてのバージョンで同じ結果を返します。

db.events.find( {
$expr: {
$lt: [ { $hour: { date: "$occurredAt",
timezone: "America/New_York" } }, 9 ]
}
} )

決定的な比較または直列化を必要とするJavaScriptの場合は、ローカルの Date メソッドや暗黙的な string 変換ではなく、getTime()、toISOString()、または getUTC*() メソッドを使用します。ソートされた値に日付を含めることができる場合は、明示的な比較演算子を Array.prototype.sort() に渡します。

詳しくは、 サーバーサイドJavaScript を参照してください。

MongoDB9.0 以降、サーバーサイドJavaScript はppc64le アーキテクチャでは利用できません。 の バイナリとmongod mongosppc64leバイナリにはJavaScriptエンジン$function は含まれていません。その結果、そのアーキテクチャでは、 、$accumulator 、 、$where mapReduceの操作は失敗します。以前のバージョンでは、ppc64le でこれらの操作が実行されていました。

構成ファイル設定または コマンドライン オプションを使用して、ppc64le でサーバーサイドJavaScript を有効にすることはできません。

ppc64le配置をMongoDB9.0 $functionにアップグレードする前に、 、 、$accumulator 、または$where mapReduceを使用するアプリケーションを特定します。サーバー側JavaScriptを必要としない集計パイプラインステージと演算子を使用するには、これらの操作を書き換えます。また、別のアーキテクチャを使用する配置で操作を実行することもできます。

詳しくは、 サーバーサイドJavaScript を参照してください。

MongoDB 9.0 は、 Queryable Encryptionが有効なコレクションの暗号化された文字列フィールドに対するプレフィックス、サフィックス、サブストリング クエリの GA 版をマークします。 GA 機能は、 MongoDB 8.2 でリリースされたパブリック プレビュー バージョンと互換性がありません。この機能は現在 GA 版が提供されているため、このバージョンは使用しないでください。

Queryable Encryptionでプレフィックス、サフィックス、またはサブストリング クエリを使用するには、 MongoDB9.0 9.0がバージョン 以降で、かつ と互換性のあるドライバーを使用している必要があります。パブリック プレビューを引き続き使用する場合、 MongoDB8.2 8.38.283はバージョン または に維持され、かつ または と互換性のあるドライバーを使用する必要があります。

MongoDB 9.0 ドライバーは、 MongoDB 8.2 または 8.3 ドライバーで作成されたデータを復号化できます。アップグレード オプションについては、次のセクションを参照してください。

可能であれば、パブリック プレビュー機能を使用して作成されたコレクションを移行するのではなく、新しいコレクションを作成します。

  1. MongoDBサーバーとドライバーを 9.0 にアップグレードします。

  2. 前のコレクションとは異なる名前で新しい暗号化されたコレクションを設定します。

  3. 新しいデータを挿入するか、ローカル コピーがある場合は既存のデータの暗号化されていないバージョンを挿入します。

  4. 前のコレクションを削除します。

新しいデータを使用できない場合、または既存のデータの暗号化されていないバージョンがない場合。

  1. MongoDBサーバーとドライバーを 9.0 にアップグレードします

  2. 9.0 互換ドライバーを使用して、暗号化されたコレクションをクエリして復号化します。

  3. 出力をローカルに保存します。

  4. 新しい暗号化されたコレクションを構成し、データを取り込みます。

警告

  • mongoexport操作とmongodump 操作ではコレクションは復号化されません。復号化されたデータを出力するには、ドライバーからコレクションをクエリする必要があります。

  • MongoDB 9.0 互換ドライバーは、 MongoDB 8.2 Public Preview クエリ タイプで暗号化されたデータの暗号化フィールドをクエリできません。データを復号化するには、暗号化されていないフィールドをクエリするか、コレクション全体をクエリします。

次のセクションでは、配置から下位互換性のない機能を削除するための情報を提供します。MongoDB 9.0 から以前のバージョンにダウングレードする場合は、以下のセクションを確認して、ダウングレード後に配置が正常に実行されることを確認してください。

MongoDB9.0 では、$convert はオブジェクトをbinData に変換できます。詳細については、「 オブジェクトを binData に変換する 」を参照してください。

この変換を使用するビューを作成すると、そのビューのクエリは が以前のバージョンにダウングレードした後にエラーを返します。

9.0 からダウングレードする前に、この変換を使用するすべてのビューをアップデートまたは削除してください。