このトピックでは、MongoDB 3.4 の互換性の変更点について説明します。
MongoDB 公式の互換性変更ドキュメントを参照するには、[従来のドキュメント] にアクセスしてください。
シャードクラスターインスタンスの変更点
明示的なメンバーロール
MongoDB 3.4 を実行するシャードクラスターインスタンスでは、シャード内のすべての mongod インスタンスは、次のいずれかの方法でロールを shardsvr として明示的に宣言する必要があります。
構成ファイル:
sharding.clusterRole: shardsvrを指定します。コマンドライン:
--shardsvrオプションを使用します。
shardsvr ロールを持つ mongod インスタンスのデフォルトポートは 27018 です。別のポートを使用するには、net.port 構成オプションまたは --port パラメーターをそのポートに設定します。
互換性の制限
MongoDB 3.4 を実行する mongos インスタンスは、以前のバージョンを実行する mongod インスタンスに接続できません。
構成オプションの削除
MongoDB 3.4 では、mongos から次の構成オプションが削除されました。
チャンクサイズ構成:
構成ファイルオプション
sharding.chunkSize。コマンドラインオプション
--chunkSize。
自動分割構成:
構成ファイルオプション
sharding.autoSplit。コマンドラインオプション
--noAutoSplit。
SCCC 構成サーバーの廃止
MongoDB 3.4 以降、シャードクラスターインスタンスは、ミラー化された (SCCC) mongod インスタンスを構成サーバーとしてサポートしなくなりました。このモードは MongoDB 3.2 で廃止されました。
構成サーバーはレプリカセットモード (CSRS) でデプロイする必要があります。シャードクラスターインスタンスを MongoDB 3.4 にアップグレードするには、構成サーバーが次の要件を満たしている必要があります。
CSRS モードで実行されている必要があります。
SCCC モードの場合は、CSRS モードに変換できます。
初期同期におけるコレクション名の変更の互換性
同期元としてのコレクションの名前が初期同期中に変更された場合、初期同期プロセスは失敗して再起動され、潜在的なデータ破損のリスクが回避されます。詳細については、「SERVER-26117」をご参照ください。
以下の操作には、コレクション名の変更が含まれます。
renameCollectionコマンド:db.collection.renameCollection()メソッドなど。集約操作の
$outステージ。たとえば、db.collection.aggregate()メソッドを使用するか、$outステージを指定したaggregateコマンドを使用します。MapReduce の
outオプション。たとえば、db.collection.mapReduce()メソッドを使用するか、outオプションを指定したmapReduceコマンドを使用します。通常のコレクションをキャップ付きコレクションに変換するために使用される
convertToCappedコマンド。
MongoDB 3.2.11 以前から 3.4 にアップグレードする場合、コレクション名の変更操作が発生すると初期同期が失敗する可能性があります。
MongoDB v3.2.11 より前では、データを破損する可能性のあるコレクション名の変更操作が発生した場合でも、初期同期プロセスは続行されます。詳細については、「SERVER-4941」をご参照ください。
非推奨の操作
group コマンド
MongoDB 3.4 以降、group コマンドと mongo シェルメソッド db.collection.group() は非推奨です。db.collection.aggregate() または db.collection.mapReduce() を代わりに使用してください。
カーソル情報のない aggregate コマンド
MongoDB 3.6 以降、実行計画を分析するために explain オプションが指定されていない限り、aggregate コマンドの出力には cursor オプションにカーソルが含まれている必要があります。
デフォルトのバッチサイズでカーソルを示すには、cursor:
{}を指定します。デフォルト以外バッチサイズでカーソルを示すには、
cursor: { batchSize: <num> }を使用します。
コレクションとインデックスの仕様
コレクションオプションの検証
MongoDB 3.4 以降、create コマンドと db.createCollection() 操作では、コレクションオプションのより厳密な検証が実行されます。create または db.createCollection() でサポートされている有効なオプションを使用する必要があります。
たとえば、無効なオプション cappedtypo が含まれているため、次の操作は無効になりました。
db.createCollection( "myCappedCollection", { cappedtypo: true, size: 5242880 } )インデックス仕様の検証
MongoDB 3.4 以降、createIndexes コマンドと db.collection.createIndex() メソッドは、インデックスを作成するときに、より厳密な検証を実行します。このより厳密な検証は、既存のインデックスには影響しません。次の検証ルールが適用されます。
インデックスキースキーマ
key: valueのvalueが有効であることを確認します。許可される値:値
説明
0 より大きい数値
昇順インデックスの場合。
0 より小さい数値
降順インデックスの場合。
文字列
特殊なインデックスタイプの場合、「text」、「2dsphere」、「2d」、および「hashed」のみが許可されます。
たとえば、次の操作は無効になりました。
db.collection.createIndex( { x: 0 } ); db.collection.createIndex( { y: "text2d" } ); db.collection.createIndex( { z: NaN } ); db.collection.createIndex( { x: 1, unique: true } )指定されたインデックスオプションが有効であることを確認します。MongoDB 3.4 より前では、無効なインデックスオプションは無視されていました。ただし、MongoDB 3.4 以降、無効なインデックスオプションを指定すると、MongoDB はエラーを報告します。たとえば、次の操作は無効になりました。
db.collection.createIndex( { y: 1 }, { uniques2: true} ); db.collection.createIndex( { z: 1 }, { expireAfterSec: 350 } )
一般的な互換性の変更
名前空間の制限の調整: MongoDB 3.4 以降、データベース名では
$記号がサポートされなくなりました。説明MongoDB 3.4 にアップグレードする前に、名前に
$が含まれるすべてのデータベースを削除する必要があります。textSearchEnabledパラメーターの削除。MongoDB 2.6 以降、MongoDB はデフォルトでテキスト検索を有効にしています。mongosniffツールの削除: MongoDB 3.4 以降、mongosniffは、より強力な機能を提供し、より柔軟なネットワークトラフィックキャプチャと分析をサポートするツールmongoreplayに置き換えられました。$project集約ステージの動作の変更:$projectステージが空のドキュメント (フィールドが保持または追加されていない) を返す場合、エラーが報告されます。ヒントと疎インデックスのカウントの問題: コレクション内のドキュメントをカウントする際に (空のクエリ述語を使用して)、疎インデックスを指定する
hint()を使用すると、疎インデックスによってカウント結果が不正確になる可能性があります。db.collection.insert({ _id: 1, y: 1 } ); db.collection.createIndex( { x: 1 }, { sparse: true } ); db.collection.find().hint( { x: 1 } ).count();正しいカウント結果を得るには、コレクション内のすべてのドキュメントをカウントする際に、
hint()に疎インデックスを指定しないでください。db.collection.find().count(); db.collection.createIndex({ y: 1 }); db.collection.find().hint({ y: 1 }).count();MongoDB 3.4 より前では、疎インデックスの使用によってカウント結果が欠落した場合、ヒントは無視されていました。
ユーザーロール権限の変更
MongoDB 3.4 以降、次の組み込みロールの権限は、local データベースと config データベースには適用されなくなりました。
ロール名 | 説明 |
readAnyDatabase | local データベースに対する読み取り権限を付与するには、admin データベースにユーザーを作成し、local データベースの read ロールを明示的にユーザーに割り当てます。または、clusterManager ロールまたは clusterMonitor ロールを使用して config データベースと local データベースにアクセスします。 |
readWriteAnyDatabase | local データベースに対する読み取り/書き込み権限を付与するには、admin データベースにユーザーを作成し、local データベースの readWrite ロールを明示的にユーザーに割り当てます。 |
userAdminAnyDatabase | 該当なし。 |
dbAdminAnyDatabase | local データベースに対する管理権限を付与するには、admin データベースにユーザーを作成し、local データベースの dbAdmin ロールを明示的にユーザーに割り当てます。 |
次の組み込みロールは、local データベースと config データベースに対する権限を持っています。
clusterManager
clusterMonitor
backup
restore
以降のバージョンと互換性のない機能
MongoDB 3.4 では、以前のバージョンでは不適切に処理されていたデータを永続化する次の機能が導入されています。これらの機能を有効にするには、featureCompatibilityVersion を "3.4" に設定します。
ビュー
照合順序と大文字と小文字を区別しないインデックス
10 進数型
インデックスバージョン v2
照合順序と 10 進数データ型をサポートします。
featureCompatibilityVersionが "3.4" に設定されている場合、新しいインデックスのデフォルトバージョンは v2 です。それ以外の場合、デフォルトバージョンは v1 です。
これらの互換性のない機能を有効にすると、ダウンロードプロセスが複雑になります。
ダウングレードの可能性を最小限に抑えるには、アップグレード後にこれらの機能を有効にせずにデプロイメントを実行することをお勧めします。ダウングレードの可能性が最小限であることを確認した場合にのみ、これらの機能を有効にしてください。
デフォルトの featureCompatibilityVersion 値:
MongoDB 3.4 の新規デプロイメント: "3.4"。
MongoDB 3.2 からアップグレードされたデプロイメント: "3.2" ("3.4" に手動で設定する必要があります)。
MongoDB 3.4 より前では、データベースにビュー、照合順序の定義、または v2 インデックスが含まれている場合、MongoDB は起動できません。10 進数型のフィールドが存在する場合、これらのドキュメントの操作が失敗する可能性があります。
MongoDB 3.4 にアップグレードするには、ビュー、v2 インデックス、10 進数フィールドなど、互換性のないすべてのデータをクリアする必要があります。
ドライバーの互換性の変更
MongoDB 3.4 で導入された新機能 (10 進数型や照合順序など) を使用するには、これらの機能をサポートするバージョンのドライバーにアップグレードする必要があります。
単一要素 $in と upsert 動作の変更
upsert 操作で一致するドキュメントが見つからない場合、クエリ述語の等価ステートメントに基づいて upsert のベースドキュメントを作成し、ドキュメントに更新演算子を適用します。例:
db.c.drop()
db.c.update( { a : 3, b: "foo" }, { $set : { c : 15 } }, { upsert : true } )
db.c.find()
{ "_id" : ObjectId("59c03009529946822d0afb8c"), "a" : 3, "b" : "foo", "c" : 15 }MongoDB 3.4 より前では、単一要素の $in はフィールドを初期化しません。
db.c.drop()
db.c.update( { a : { $in : [1] } }, { $addToSet : { a : 2 } }, { upsert : true } )
db.c.find()
{ "_id" : ObjectId("58bdb00eb39e8f87607e9222"), "a" : [ 2 ] }MongoDB 3.4 以降、単一要素の $in は、upsert の等価ステートメントとして扱われます。
クエリ述語に単一要素の
$inが含まれている場合、フィールドは配列ではなくスカラーフィールドとして初期化されます。前の例の
$addToSet操作は、配列演算子をスカラーフィールドに適用できないため失敗します。
解決策: $in 式を $elemMatch でラップして、フィールドの配列型を強制的に維持します。
db.c.drop()
db.c.update(
{ a : { $elemMatch : { $in : [ 2 ] } } },
{ $addToSet : { a: 3 } },
{ upsert: true } )
db.c.find()
{ "_id" : ObjectId("..."), "a" : [ 3 ] }