MongoDB 4.4 での互換性の変更
次の4.4 の変更は、MongoDB の古いバージョンとの互換性に影響を与える可能性があります。
削除されたコマンド
MongoDBでは、次のコマンドと {0mongo
shell ヘルパーが削除されます。
削除されたコマンド | 削除されたヘルパー | 代替手段 |
---|---|---|
cloneCollection | db.cloneCollection() |
|
planCacheListPlans | PlanCache.getPlansByQuery() |
See also $planCacheStats Changes. |
planCacheListQueryShapes | PlanCache.listQueryShapes() |
See also $planCacheStats Changes. |
削除されたパラメーター
MongoDB では次のサーバーパラメーターが除かれます。
削除されたパラメータ | 説明 |
---|---|
failIndexKeyTooLong | MongoDB 4.4では failIndexKeyTooLong パラメータが削除されます。 このパラメータは4.2で非推奨となり、 featureCompatibilityVersion (fCV)バージョン4.2 + の MongoDB ではインデックス キー サイズ制限が課されなくなりました。 |
ツールの変更
Community エディションと Enterprise エディションの両方のWindows MSI インストーラーにはMongoDB Database Toolsは含まれていません( mongoimport
、 mongoexport
など)。 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
出力フィールドの変更
replSetGetStatus
コマンドとその mongo
shellヘルパーrs.status()
は、その出力から次の非推奨フィールドを削除します。
削除されたフィールド | 代替 |
---|---|
replSetGetStatus.syncingTo | 代わりに syncSourceHost を使用してください。 |
members[n].syncingTo | 代わりに members[n].syncSourceHost を使用してください。 |
レプリカ構成ドキュメントの変更
MongoDB4.4 は、レプリカセットterm
構成ドキュメント に フィールドを追加します。レプリカセット ノードは、 term
とversion
を使用して「最新」レプリカ構成でコンテキストを実現します。 featureCompatibilityVersion (fCV) : " 4 . 4 " に設定します 暗黙的にreplSetReconfig
を実行して構成ドキュメントにterm
フィールドを追加し、新しい構成がレプリカセット ノードの大部分に伝播するまでブロックします。 同様に、 fCV : "4.2"
にダウングレードすると、 term
フィールドが削除されるための再構成が暗黙的に実行されます。
操作における最初の同期の制限
レプリカセット ノードで次の操作を実行するには、ノードがPRIMARY
またはSECONDARY
状態である必要があります。
ノードがSTARTUP2
などの別の状態にある場合、操作はエラーになります。
カスタムgetLastErrorDefaults
値は非推奨
バージョン4.4以降、 MongoDB では、デフォルトの{ w: 1, wtimeout: 0 }
以外のsettings.getLastErrorDefaults
値の指定が非推奨となります。 MongoDB 4.4はユーザーが指定した任意の書込み保証 (write concern) の値を尊重しますが、将来の MongoDB バージョンはデフォルト以外の値を尊重しない可能性があります。 代わりに、 setDefaultRWConcern
コマンドを使用して、レプリカセットまたはシャーディングされたクラスターのデフォルトの読み取りまたは書込み保証 (write concern) を設定します。
プロジェクションの互換性の変更
フィールドを新しい値に設定
MongoDB 4.4以降、 findとfindAndModify()
プロジェクションでは集計式と集計構文 を受け付けます。
集計式と構文規則(リテラルと集計変数の使用を含む)では、プロジェクション フィールド値としてリテラル(数値またはブール値以外)を指定すると、フィールドは新しい値でプロジェクションされます。
たとえば、 status
フィールドを含むドキュメントを含むコレクション インベントリを考えてみましょう。
db.inventory.insertOne( { _id: 1, item: "postcard", status: "A", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] })
MongoDB 以降、 4.4では、次の操作では、フィールドstatus
とinstock
を現在の値ではなく新しい値でプロジェクションします。
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
プロジェクション フィールドの順序
ドキュメント内のフィールドの順序に関係なく、既存フィールドの$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
の埋め込み配列
ネストされたドキュメント内の配列の$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 }
と同じ結果を生成します。
パスの不一致: 配列の と埋め込みフィールド$slice
findとfindAndModify()
プロジェクションには、配列の$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()
メソッドを使用します。
$
-プレフィックスが付いたフィールドパス制限
findとfindAndModify()
プロジェクションでは、 DBRef フィールドを除き、 $
で始まるフィールドをプロジェクションできません。
たとえば、次の操作は無効です。
db.inventory.find( {}, { "$instock.warehouse": 0, "$item": 0, "detail.$price": 1 } )
$
位置演算子の配置制限
$
プロジェクション演算子は、フィールドパスの末尾にのみ使用できます(例: "field.$"
または"fieldA.fieldB.$"
。
たとえば、次の操作は無効です。
db.inventory.find( { }, { "instock.$.qty": 1 } )
解決するには、$
プロジェクション演算子の後に続くフィールドパスのコンポーネントを削除してください。
$
位置演算子と$slice
の制限
find と プロジェクションには、findAndModify()
$slice
$
プロジェクション式の一部として プロジェクション式を含めることはできません。
たとえば、次の操作は無効です。
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )
以前のバージョンでは、MongoDB はクエリ条件に一致する instock
配列の最初の要素(instock.$
)を返します。つまり、位置プロジェクション"instock.$"
が優先され、$slice:1
の処理はありません。"instock.$": {
$slice: 1 }
は他のドキュメント フィールドを除外しません。
空のフィールド名に対するプロジェクション制限
findとfindAndModify()
プロジェクションには、空のフィールド名のプロジェクションを含めることはできません。
たとえば、次の操作は無効です。
db.inventory.find( { }, { "": 0 } )
以前のバージョンでは、MongoDB は空のフィールドの包含/除外を、存在しないフィールドのプロジェクションと同様に扱っていました。
テキスト検索メタデータ { $meta: "textScore" } クエリ要件
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" } } );
$sort
変更点
MongoDB 4.4以降、 sort()
メソッドで$sort
集計ステージと同じソート アルゴリズムが使用されるようになりました。 この変更により、重複する値を含むフィールドに対してsort()
を実行するクエリでは、それらの値のソート順序が一貫しない可能性が高まります。
重複する値に対してsort()
を使用するときに並べ替えの整合性を保証するには、一意の値のみを含む追加のフィールドを並べ替えに含めます。
これは、並べ替えに_id
フィールドを追加することで簡単に実現できます。
詳細については、「ソートの整合性」を参照してください。
map reduce の変更
単一の値を含むキーの削減
MongoDB 4.4以降、 mapReduce
コマンドを実行すると、関連付けられたキーに含まれる値の数に関係なく、MongoDB はreduce
関数を呼び出します。
以前のバージョンでは、MongoDB は単一の値を持つキーに対してreduce
関数を呼び出しませんでした。
詳細については、「 使用状況 」を参照してください。
map-reduce 出力の変更
MongoDB 4.4以降、 mapReduce
は、その出力からcounts
フィールドを削除します。
以前のバージョンでは、 コマンドの出力にcounts
フィールドが含まれていました。 例:
"counts" : { "input" : 4, "emit" : 4, "reduce" : 1, "output" : 2 },
Map Function's Emit Limit
MongoDB 4.4以降、 map
関数は各emit()
出力のサイズを MongoDB の最大 BSON ドキュメント サイズの半分に制限しなくなりました。
以前のバージョンでは、1 回の発行で MongoDB の最大 BSON ドキュメント サイズの半分しか保持できませんでした
スコープを持つ BSON 型 JavaScript コードのサポートを廃止します
mapReduce
は、関数の中で非推奨のBSON Type JavaScript コード(BSON Type 15 )のサポートを終了しました。 map
、reduce
、finalize
関数は、 BSON型のstring ( BSON Type 2)またはBSON型JavaScript ( BSON Type 13)のいずれかである必要があります。 map
、 reduce
、 finalize
関数でアクセス可能な定数を渡すには、 scope
パラメーターを使用します。
mapReduce
関数のスコープを持つ JavaScript コードの使用は、バージョン 4.2.1 以降では非推奨となっています。
構造化ログ
MongoDB 4.4以降、 mongod
/ mongos
インスタンスはすべてのログ メッセージを構造化 JSON 形式で出力するようになりました。 これには、ファイル、 syslog 、 stdout (標準出力) のログ出力先、およびgetLog
コマンドの出力に送信されるログ出力が含まれます。
以前は、ログ エントリはプレーンテキストとして出力されていました。
既存のログ解析ユーティリティがある場合、またはログ取り込みサービスを使用している場合は、 MongoDB 4.4を使用して新しい構造化ログ形式用にこれらのツールを再構成する必要がある場合があります。
新しいログ構造を使用した ログ解析の例 など、新しい構造化ログ形式の詳細については、「 ログ メッセージ 」 を参照してください。
rs
getLog 値の削除
MongoDB 4.4以降、メッセージタイプのこの分類は非推奨になったため、 getLog
コマンドはrs
値を受け入れなくなりました。 代わりに、ログ メッセージは常にコンポーネントによって識別されるようになりました(レプリケーション メッセージのREPLを含む)。
コンポーネント フィールドでフィルタリングするログ解析の例については、「コンポーネントによるフィルタリング」を参照してください。
タイムスタンプの形式
構造化 JSON ロギングへの移行に伴い、 ctime
タイムスタンプ形式はサポートされなくなりました。 次の構成オプションでは、有効なパラメータとしてctime
を受け入れなくなりました。
代わりに、 iso8601-local
(デフォルト)またはiso8601-utc
タイムスタンプ形式を使用してください。
maxLogSizeKB パラメーター
構造化 JSON ロギングへの移行により、 maxLogSizeKB
サーバー パラメータは指定された制限を超えるログ エントリ内の個々の属性を切り捨てるようになりました。 以前は、このパラメーターはログ エントリ全体を切り捨てていました。
さらに、
maxLogSizeKB
が0
の値を受け入れるようになりました。これにより、切り捨てが完全に無効になります。maxLogSizeKB
負の値を受け入れなくなりました。
詳細については、「ログメッセージの切り捨て」を参照してください。
一般的な変更点
MongoDB 4.4では gperftools CPU プロファイラーのサポートが削除されます。 この変更の一環として、
hostManager
はクラスターに対するcpuProfiler
特権アクションを提供しなくなりました。パラメータ
ldapConnectionPoolMaximumConnectionsPerHost
のデフォルト値は2
になりました。 以前のバージョンのデフォルトは未設定です。serverStatus
はflowControl.locksPerKiloOp
flowControl.locksPerOp
ではなく を返します。$dateFromParts
1-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: true
とforce: false
は非推奨であるため、エラーが発生します。
db.collection.validate() パラメーターの変更
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 }) |
での完全検証 oplog
MongoDB 4.4以降、WiredTiger のoplog
での完全な検証では、より詳細なチェックがスキップされます。 validate.warnings
には の動作に関する通知が含まれています。
MMAPv 1クリーンアップ
dbStats
コマンドは廃止された MMAPv 1numExtents
フィールドを返さなくなりました。replSetGetStatus
コマンドは、出力で廃止された MMAPv 1フィールドreplSetGetStatus.initialSyncStatus.fetchedMissingDocs
を返さなくなりました。fsync
コマンドは、廃止された MMAPv 1フィールドasync
をオプションとして受け入れなくなりました。
非推奨
地理空間
MongoDB 4.4では、 geoHaystackインデックスとgeoSearch
コマンドが非推奨になります。 代わりに、 または $geoNear
とともに$geoWithin
2 d インデックス を使用してください。
BSON Type JavaScript コード(スコープ付き)
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 )のサポートを終了しました。map
、reduce
、finalize
関数は、 BSON型のstring ( BSON Type 2)またはBSON型JavaScript ( BSON Type 13)のいずれかである必要があります。map
、reduce
、finalize
関数でアクセス可能な定数を渡すには、scope
パラメーターを使用します。mapReduce
関数のスコープを持つ JavaScript コードの使用は、バージョン 4.2.1 以降では非推奨となっています。
$where
とmapReduce
関数のスコープを持つ 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の一部の機能では、 4.4バイナリだけでなく、 featureCompatibilityVersion (FCV)を4.4に設定する必要があります。 これらの機能には、次のものが含まれます。