Docs Menu
Docs Home
/
MongoDB マニュアル
/ /

MongoDB 4.4 での互換性の変更

項目一覧

  • 削除されたコマンド
  • 削除されたパラメーター
  • ツールの変更
  • レプリカセット
  • プロジェクションの互換性の変更
  • $sort 変更点
  • map reduce の変更
  • 構造化ログ
  • 一般的な変更点
  • 4.4機能の互換性

次の4.4 の変更は、MongoDB の古いバージョンとの互換性に影響を与える可能性があります。

MongoDBでは、次のコマンドと {0mongoshell ヘルパーが削除されます。

削除されたコマンド
削除されたヘルパー
代替手段
cloneCollection
db.cloneCollection()
  • mongoexportmongoimportを使用するか、

  • 集計パイプライン $outまたは$mergeステージを使用するか、 または

  • ドライバーを使用してスクリプトを作成します。

planCacheListPlans
PlanCache.getPlansByQuery()
  • 集計パイプライン ステージ$planCacheStatsを使用するか、

  • mongo shellヘルパー メソッドPlanCache.list()を使用します。 (バージョン4.4以降で利用可能 )

planCacheListQueryShapes
PlanCache.listQueryShapes()
  • 集計パイプライン ステージ$planCacheStatsを使用するか、

  • mongo shellヘルパー メソッドPlanCache.list()を使用します。 (バージョン4.4以降で利用可能 )

MongoDB では次のサーバーパラメーターが除かれます。

削除されたパラメータ
説明
failIndexKeyTooLong
MongoDB 4.4ではfailIndexKeyTooLongパラメータが削除されます。 このパラメータは4.2で非推奨となり、 featureCompatibilityVersion (fCV)バージョン4.2 + の MongoDB ではインデックス キー サイズ制限が課されなくなりました。

Community エディションと Enterprise エディションの両方のWindows MSI インストーラーにはMongoDB Database Toolsは含まれていません( mongoimportmongoexportなど)。 Windows に MongoDB Database Tools をダウンロードしてインストールするには、「 MongoDB Database Toolsのインストール 」を参照してください。

MongoDB 4.2またはそれ以前の MSI インストーラーを使用して MongoDB Server とともに Database Tools をインストールしていた場合は、Database Tools を個別にダウンロードする必要があります。

mongo 4.4 以降、コレクションのロールバック ディレクトリは、コレクション名前空間ではなく、コレクションの UUID にちなんで命名されます。例:

<dbpath>/rollback/20f74796-d5ea-42f5-8c95-f79b39bad190/removed.2020-02-19T04-57-11.0.bson

詳細については、「データのロールバック 」を参照してください。

replSetGetStatusコマンドとその mongo shellヘルパーrs.status()は、その出力から次の非推奨フィールドを削除します。

削除されたフィールド
代替
replSetGetStatus.syncingTo
代わりに syncSourceHost を使用してください。
members[n].syncingTo
代わりに members[n].syncSourceHost を使用してください。

MongoDB4.4 は、レプリカセットterm 構成ドキュメント に フィールドを追加します。レプリカセット ノードは、 termversionを使用して「最新」レプリカ構成でコンテキストを実現します。 featureCompatibilityVersion (fCV) : " 4 . 4 " に設定します 暗黙的にreplSetReconfigを実行して構成ドキュメントにtermフィールドを追加し、新しい構成がレプリカセット ノードの大部分に伝播するまでブロックします。 同様に、 fCV : "4.2"にダウングレードすると、 termフィールドが削除されるための再構成が暗黙的に実行されます。

レプリカセット ノードで次の操作を実行するには、ノードがPRIMARYまたはSECONDARY状態である必要があります。

ノードがSTARTUP2などの別の状態にある場合、操作はエラーになります。

バージョン4.4以降、 MongoDB では、デフォルトの{ w: 1, wtimeout: 0 }以外のsettings.getLastErrorDefaults値の指定が非推奨となります。 MongoDB 4.4はユーザーが指定した任意の書込み保証 (write concern) の値を尊重しますが、将来の MongoDB バージョンはデフォルト以外の値を尊重しない可能性があります。 代わりに、 setDefaultRWConcernコマンドを使用して、レプリカセットまたはシャーディングされたクラスターのデフォルトの読み取りまたは書込み保証 (write concern) を設定します。

MongoDB 4.4以降、 findfindAndModify()プロジェクションでは集計式と集計構文 を受け付けます。

集計式と構文規則(リテラルと集計変数の使用を含む)では、プロジェクション フィールド値としてリテラル(数値またはブール値以外)を指定すると、フィールドは新しい値でプロジェクションされます。

たとえば、 statusフィールドを含むドキュメントを含むコレクション インベントリを考えてみましょう。

db.inventory.insertOne( { _id: 1, item: "postcard", status: "A", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] })

MongoDB 以降、 4.4では、次の操作では、フィールドstatusinstockを現在の値ではなく新しい値でプロジェクションします。

db.inventory.find(
{ status: "A" },
{ status: "Active", instock: ["blue", "crimson"] }
)

つまり、この操作は次のドキュメントを返します。

{ "_id" : 1, "status" : "Active", "instock" : [ "blue", "crimson" ] }

以前のバージョンでは、すべての指定値(ゼロ/false 値または以前にサポートされていない ドキュメント値を除く)は、現在の値を持つフィールドが含まれていることを示すtrueとして扱われていました。 つまり、以前のバージョンでは、前の操作では現在の値を持つstatus instockフィールドと フィールドが含まれるドキュメントが返されます。

{ "_id" : 1, "status" : "A", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }

ドキュメント内のフィールドの順序に関係なく、既存フィールドの$elemMatchプロジェクションでは、他の既存フィールドを包含した後にフィールドが返されます。

たとえば、次のドキュメントを含む players コレクションを考えます。

db.players.insertOne( {
name: "player1",
games: [ { game: "abc", score: 8 }, { game: "xyz", score: 5 } ],
joined: new Date("2020-01-01"),
lastLogin: new Date("2020-05-01")
} )

次のプロジェクションでは、ドキュメントではjoinedフィールドとlastLoginフィールドの前に フィールドがリストされているにもかかわらず、プロジェクションに含まれる他の既存フィールドの後にgamesフィールドが返されます。

db.players.find( {}, { games: { $elemMatch: { score: { $gt: 5 } } }, joined: 1, lastLogin: 1 } )

つまり、この操作は次のドキュメントを返します。

{
"_id" : ObjectId("5edef64a1c099fff6b033977"),
"joined" : ISODate("2020-01-01T00:00:00Z"),
"lastLogin" : ISODate("2020-05-01T00:00:00Z"),
"games" : [ { "game" : "abc", "score" : 8 } ]
}

ネストされたドキュメント内の配列の$sliceプロジェクションは、プロジェクションがインクルージョン プロジェクションの一部である場合、ネストされたドキュメント内の他のフィールドを返さなくなりました。

たとえば、size フィールドを含むドキュメントを含むコレクション inventory を考えます。

{ item: "socks", qty: 100, details: { colors: [ "blue", "red" ], sizes: [ "S", "M", "L"] } }

次の操作では、 _idフィールド(デフォルト)、 qtyフィールド、およびdetailsフィールドを、 colors配列の指定されたスライスのみでプロジェクションします。

db.inventory.find( { }, { qty: 1, "details.colors": { $slice: 1 } } )

つまり、この操作は次のドキュメントを返します。

{ "_id" : ObjectId("5ee92a6ec644acb6d13eedb1"), "qty" : 100, "details" : { "colors" : [ "blue" ] } }

$sliceプロジェクションが除外プロジェクションの一部である場合、操作はネストされたドキュメント内の他のフィールドを引き続き返します。 つまり、次のプロジェクションは除外プロジェクションです。 プロジェクションでは、 _idフィールドと指定されたスライスの範囲外のcolors配列内の要素は除外され、他のすべてのフィールドが返されます。

db.inventory.find( { }, { _id: 0, "details.colors": { $slice: 1 } } )
{ "item" : "socks", "qty" : 100, "details" : { "colors" : [ "blue" ], "sizes" : [ "S", "M", "L" ] } }

$sliceプロジェクション自体は除外されていると見なされます。

以前のバージョンでは、プロジェクションが包含か除外かに関係なく、 $sliceプロジェクションにはネストされたドキュメント内の他のフィールドも含まれていました。

埋め込みドキュメントのフィールドを使用して、埋め込みドキュメントをプロジェクトすることはできません。

たとえば、size フィールドを含むドキュメントを含むコレクション inventory を考えます。

{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... }

次の操作は、sizeドキュメントと size.uom フィールドの両方をプロジェクトしようとするためPath collision エラーで失敗します。

db.inventory.find( {}, { size: 1, "size.uom": 1 } )

以前のバージョンでは、埋め込まれたドキュメントとそのフィールドの間で、最後に指定されたプロジェクションが適用されていました。

  • 埋め込みドキュメントのプロジェクションが、そのフィールドの任意のプロジェクションよりも後の場合、MongoDB は埋め込みドキュメントをプロジェクトします。たとえば、プロジェクション ドキュメント { "size.uom": 1, size: 1 } はプロジェクション ドキュメント { size: 1 } と同じ結果を生成します。

  • 埋め込みドキュメントのプロジェクションが、そのフィールドのいずれかのプロジェクションよりも前の場合、MongoDB は指定されたフィールドをプロジェクションします。たとえば、プロジェクション ドキュメント { "size.uom": 1, size: 1, "size.h": 1 } はプロジェクション ドキュメント { "size.uom": 1, "size.h": 1 } と同じ結果を生成します。

findfindAndModify()プロジェクションには、配列の$sliceと配列に埋め込まれたフィールドの両方を含めることはできません。

たとえば、配列フィールド instock を含むコレクション inventory を考えます。

{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }

次の操作はPath collisionエラーで失敗します。

db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )

以前のバージョンでは、プロジェクションは両方のプロジェクションを適用し、instock 配列の最初の要素($slice: 1)を返しますが、プロジェクションされた要素の warehouse フィールドは非表示にされていました。MongoDB 4.4 以降で同じ結果を得るには、2 つの個別の $project ステージで db.collection.aggregate() メソッドを使用します。

findfindAndModify()プロジェクションでは、 DBRef フィールドを除き、 $で始まるフィールドをプロジェクションできません。

たとえば、次の操作は無効です。

db.inventory.find( {}, { "$instock.warehouse": 0, "$item": 0, "detail.$price": 1 } )

$プロジェクション演算子は、フィールドパスの末尾にのみ使用できます(例: "field.$"または"fieldA.fieldB.$"

たとえば、次の操作は無効です。

db.inventory.find( { }, { "instock.$.qty": 1 } )

解決するには、$ プロジェクション演算子の後に続くフィールドパスのコンポーネントを削除してください。

find と プロジェクションには、findAndModify() $slice$プロジェクション式の一部として プロジェクション式を含めることはできません。

たとえば、次の操作は無効です。

db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )

以前のバージョンでは、MongoDB はクエリ条件に一致する instock 配列の最初の要素(instock.$)を返します。つまり、位置プロジェクション"instock.$" が優先され、$slice:1 の処理はありません。"instock.$": { $slice: 1 } は他のドキュメント フィールドを除外しません。

findfindAndModify()プロジェクションには、空のフィールド名のプロジェクションを含めることはできません。

たとえば、次の操作は無効です。

db.inventory.find( { }, { "": 0 } )

以前のバージョンでは、MongoDB は空のフィールドの包含/除外を、存在しないフィールドのプロジェクションと同様に扱っていました。

MongoDB4.4 以降、プロジェクションまたはソートで$text 式を使用するには、 操作のクエリ述語にdb.collection.find() { $meta: "textScore" }演算子を指定する必要があります。例:

db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
);
db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } );

クエリ述語に$text演算子を指定しないと、操作は失敗します。 たとえば、次の操作は MongoDB 4.4以降では無効です。

db.articles.find(
{ },
{ score: { $meta: "textScore" } }
)
db.articles.find(
{ },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } );

MongoDB 4.4以降、 sort()メソッドで$sort集計ステージと同じソート アルゴリズムが使用されるようになりました。 この変更により、重複する値を含むフィールドに対してsort()を実行するクエリでは、それらの値のソート順序が一貫しない可能性が高まります。

重複する値に対してsort()を使用するときに並べ替えの整合性を保証するには、一意の値のみを含む追加のフィールドを並べ替えに含めます。

これは、並べ替えに_idフィールドを追加することで簡単に実現できます。

詳細については、「ソートの整合性」を参照してください。

MongoDB 4.4以降、 mapReduceコマンドを実行すると、関連付けられたキーに含まれる値の数に関係なく、MongoDB はreduce関数を呼び出します。

以前のバージョンでは、MongoDB は単一の値を持つキーに対してreduce関数を呼び出しませんでした。

詳細については、「 使用状況 」を参照してください

MongoDB 4.4以降、 mapReduceは、その出力からcountsフィールドを削除します。

以前のバージョンでは、 コマンドの出力にcountsフィールドが含まれていました。 例:

"counts" : {
"input" : 4,
"emit" : 4,
"reduce" : 1,
"output" : 2
},

MongoDB 4.4以降、 map関数は各emit()出力のサイズを MongoDB の最大 BSON ドキュメント サイズの半分に制限しなくなりました。

以前のバージョンでは、1 回の発行で MongoDB の最大 BSON ドキュメント サイズの半分しか保持できませんでした

mapReduceは、関数の中で非推奨のBSON Type JavaScript コード(BSON Type 15 )のサポートを終了しました。 mapreducefinalize 関数は、 BSON型のstring ( BSON Type 2)またはBSON型JavaScript ( BSON Type 13)のいずれかである必要があります。 mapreducefinalize関数でアクセス可能な定数を渡すには、 scopeパラメーターを使用します。

mapReduce関数のスコープを持つ JavaScript コードの使用は、バージョン 4.2.1 以降では非推奨となっています。

Tip

以下も参照してください。

MongoDB 4.4以降、 mongod / mongosインスタンスはすべてのログ メッセージを構造化 JSON 形式で出力するようになりました。 これには、ファイルsyslogstdout (標準出力) のログ出力先、およびgetLogコマンドの出力に送信されるログ出力が含まれます。

以前は、ログ エントリはプレーンテキストとして出力されていました。

既存のログ解析ユーティリティがある場合、またはログ取り込みサービスを使用している場合は、 MongoDB 4.4を使用して新しい構造化ログ形式用にこれらのツールを再構成する必要がある場合があります。

新しいログ構造を使用した ログ解析の例 など、新しい構造化ログ形式の詳細については、「 ログ メッセージ 」 を参照してください。

MongoDB 4.4以降、メッセージタイプのこの分類は非推奨になったため、 getLogコマンドはrs値を受け入れなくなりました。 代わりに、ログ メッセージは常にコンポーネントによって識別されるようになりました(レプリケーション メッセージのREPLを含む)。

コンポーネント フィールドでフィルタリングするログ解析の例については、「コンポーネントによるフィルタリング」を参照してください。

構造化 JSON ロギングへの移行に伴い、 ctimeタイムスタンプ形式はサポートされなくなりました。 次の構成オプションでは、有効なパラメータとしてctimeを受け入れなくなりました。

代わりに、 iso8601-local (デフォルト)またはiso8601-utcタイムスタンプ形式を使用してください。

構造化 JSON ロギングへの移行により、 maxLogSizeKBサーバー パラメータは指定された制限を超えるログ エントリ内の個々の属性を切り捨てるようになりました。 以前は、このパラメーターはログ エントリ全体を切り捨てていました。

さらに、

  • maxLogSizeKB0の値を受け入れるようになりました。これにより、切り捨てが完全に無効になります。

  • maxLogSizeKB 負の値を受け入れなくなりました。

詳細については、「ログメッセージの切り捨て」を参照してください。

  • MongoDB 4.4では gperftools CPU プロファイラーのサポートが削除されます。 この変更の一環として、 hostManagerはクラスターに対するcpuProfiler特権アクションを提供しなくなりました。

  • パラメータldapConnectionPoolMaximumConnectionsPerHostのデフォルト値は2になりました。 以前のバージョンのデフォルトは未設定です。

  • serverStatusflowControl.locksPerKiloOp flowControl.locksPerOpではなく を返します。

  • $dateFromParts1-9999式演算子が、 フィールドとyear フィールドに対してisoWeekYear の値範囲をサポートするようになりました。以前のバージョンでは、これらのフィールドでサポートされている値の範囲は0-9999でした。

  • listIndexesおよび mongo shellヘルパー メソッドdb.collection.getIndexes()は、インデックス仕様ドキュメントの名前空間 ns フィールドを返さなくなりました。

  • MongoDB 4.4では、 --noIndexBuildRetryコマンドライン オプションと対応するstorage.indexBuildRetryオプションが削除されます。

  • mongosは、書込み保証をサポートしていないコマンドに空のwriteConcern値、つまりwriteConcern: {}を渡すとエラーをログに記録するようになりました。 以前のバージョンでは、 mongosはこれらのコマンドの空のwriteConcern値を無視します。

  • compactコマンドのforceオプションはブール値ではなくなりました。 force: trueforce: falseは非推奨であるため、エラーが発生します。

mongoメソッドdb.collection.validate()はブール値パラメータのみを受け付けなくなりました。

つまり、 メソッドはdb.collection.validate(<boolean>)db.collection.validate({full: <boolean>})の省略形として受け入れなくなりました。

の代わりに
使用
db.collection.validate(true)
db.collection.validate({ full: true })
db.collection.validate(false)
db.collection.validate() -or-
db.collection.validate({ full: false })

MongoDB 4.4以降、WiredTiger のoplogでの完全な検証では、より詳細なチェックがスキップされます。 validate.warningsには の動作に関する通知が含まれています。

  • dbStatsコマンドは廃止された MMAPv 1 numExtentsフィールドを返さなくなりました。

  • replSetGetStatusコマンドは、出力で廃止された MMAPv 1フィールドreplSetGetStatus.initialSyncStatus.fetchedMissingDocsを返さなくなりました。

  • fsyncコマンドは、廃止された MMAPv 1フィールドasyncをオプションとして受け入れなくなりました。

MongoDB 4.4では、 geoHaystackインデックスとgeoSearchコマンドが非推奨になります。 代わりに、 または $geoNearとともに$geoWithin2 d インデックス を使用してください。

MongoDB 4.4 以降:

  • $whereは、非推奨の BSON type JavaScript コード(スコープ付き)のサポートを終了しました(BSON Type 15 )。 $where演算子は、 BSON型のstring ( BSON Type 2)またはBSON型JavaScript ( BSON Type 13)のみをサポートします。

  • mapReduceは、関数の中で非推奨のBSON Type JavaScript コード(BSON Type 15 )のサポートを終了しました。 mapreducefinalize 関数は、 BSON型のstring ( BSON Type 2)またはBSON型JavaScript ( BSON Type 13)のいずれかである必要があります。 mapreducefinalize関数でアクセス可能な定数を渡すには、 scopeパラメーターを使用します。

    mapReduce関数のスコープを持つ JavaScript コードの使用は、バージョン 4.2.1 以降では非推奨となっています。

$wheremapReduce関数のスコープを持つ BSON 型 JavaScript コードの使用は、 MongoDB 4.2.1以降では非推奨となっています。

MongoDB 4.4では、次のシャーディング コマンドが非推奨になります。

MongoDB 4.4以降、WiredTiger ルックサイド テーブル(LAS)キャッシュ オーバーフロー ファイルが存在しなくなりました。 そのため、MongoDB 4.4は、(LAS)キャッシュ オーバーフロー ファイル制限の次のオプションとパラメーターを非推奨にします。これらのオプションと パラメーターは MongoDB 4.4以降では効果がありません。

  • storage.wiredTiger.engineConfig.maxCacheOverflowFileSizeGB 構成ファイル オプション

  • --wiredTigerMaxCacheOverflowFileSizeGB コマンドライン オプション

  • wiredTigerMaxCacheOverflowSizeGB parameter

4.4の一部の機能では、 4.4バイナリだけでなく、 featureCompatibilityVersion (FCV)を4.4に設定する必要があります。 これらの機能には、次のものが含まれます。

  • fCV が4.4 + に設定されている MongoDB バージョンの名前空間の長さの制限を引き上げます。

  • ハッシュされた複合インデックスを作成するには、FCV を4.4 + に設定する必要があります。

戻る

4.4