Release Notes for MongoDB 3.6の翻訳です。原文はMongoDB Documentation Teamによるものです。ライセンスはCC BY-NC-SA 3.0となっています。
MongoDB documentation is distributed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported license.
脚注は、リリースノート以外の3.6のマニュアルなども参考にして今回付け加えたものです。
MongoDB 3.6 リリースノート
セキュリティ
デフォルトでlocalhostにのみバインド
MongoDB 3.6から、MongoDBのバイナリ(mongodおよびmongos)は、デフォルトではlocalhostにのみバインドされるようになりました。以前はMongoDB 2.6以来、公式のMongoDB RPM(Red Hat, CentOS, Fedora Linux、およびその派生)、DEB(Debian, Ubuntu、およびその派生)のみがlocalhostにバインドするようになっていました。詳細はLocalhost Binding Compatibility Changesを参照してください。
認証の制限
データベースに対するユーザーの接続を、特定のIPアドレスからのみに制限するため、authenticationRestrictions
パラメータが以下のコマンドやメソッドに対して追加されました。
Commands | Methods |
---|---|
createUser | db.createUser() |
updateUser | db.updateUser() |
createRole | db.createRole() |
updateRole | db.updateRole() |
追加のセキュリティ改善
- TLS/SSL暗号化を使うときのOpenSSLの暗号アルゴリズムを制御するため、opensslCipherConfigパラメータが追加されました。
- 認証が有効な場合に限り、作成したカーソルに対しgetMoreを発行できます。
- restoreロールに対してconvertToCappedアクションが追加されました。
後方非互換な機能
Aggregation
MongoDB 3.6からは以下の機能が利用可能です。
より表現的な $lookup
$lookup は複数の結合条件および非相関サブクエリが指定可能になりました。これは結合されたコレクションに対して変数の指定とパイプライン実行を許可することで可能になったものです。
詳細は結合条件と非相関サブクエリの$lookupシンタックスを参照してください。
新しいAggregationステージ
MongoDB 3.6では以下の新しいaggregationステージが追加されました。
Operator | 説明 |
---|---|
$currentOp | mongodインスタンスでアクティブまたは休止中の操作に関する情報を含むドキュメントのストリームを返します。新しいaggregationヘルパー db.aggregate() を使います。 |
$listSessions |
config データベースのsystem.sessions コレクションのサーバセッションを列挙します。新しいaggregationヘルパーdb.aggregate()を使います。 |
$listLocalSessions | サーバによりメモリ上にキャッシュされているサーバセッションを列挙します。 |
新しいAggregationオペレータ
Operator | 説明 |
---|---|
$arrayToObject | キー・値のペアの配列をドキュメントに変換します。 |
$objectToArray | ドキュメントをキー・値のペアを表現するドキュメントの配列に変換します。 |
$mergeObjects | 複数のドキュメントを単一のドキュメントに結合します。 |
$dateFromString | 日付・時刻を表す文字列を日付オブジェクトに変換します。 |
$dateFromParts | 指定された日付の構成部品から、BSONの日付オブジェクトを構築します。 |
$dateToParts | 日付の構成部品を含むドキュメントを返します。 |
新しいAggregationヘルパー
MongoDB 3.6では、$currentOpや$listLocalSessionsで始まるものなど、もととなるコレクションを必要としないaggregationを処理するためのヘルパーとして db.aggregate() が追加されました。
新しいAggregation変数
REMOVEにて、条件に応じたフィールドの除外が可能になりました。
新しいオプション
aggregateコマンドとdb.collection.aggregate()メソッドは以下の新しいオプションをサポートします。
- どのインデックスを使うかを指定する
hint
オプション
- データベースプロファイラ、currentOp、ログなどでオペレーションを追跡しやすくするための
comment
オプション
タイムゾーンのサポート
MongoDB 3.6ではAggregationの日付オペレーションにて、タイムゾーンをサポートしました。
配列に対するupdateオペレータの改善
arrayFilters
以下のコマンドとメソッドにおいて、配列においてどの要素を変更するのか指定するためのarrayFiltersパラメータが追加されました。
Commands | Methods |
---|---|
findAndModify |
db.collection.findOneAndUpdate() db.collection.findAndModify() |
update |
db.collection.updateOne() db.collection.updateMany() db.collection.update() |
updateOneおよびupdateManyオペレーション向けのdb.collection.bulkWrite() updateOne()とupdate()メソッドのBulk()オペレーション向けのBulk.find.arrayFilters() |
配列における複数要素のupdate
MongoDB3.6では、配列およびネストされた配列に対するupdateオペレーションにて、以下の位置指定オペレータが追加されました。
- $[]オペレータによる位置指定は、配列における全指定要素を更新します。
- $[<identifier>]オペレータによる、フィルタ済みの位置指定は、arrayFilters条件に合致する全指定要素を更新します。
pushに対する負の配列インデックス
pushオペレータに対する$position指定は、負の配列インデックスを指定可能で、配列の最終要素からの位置を示します。
3.6と互換性のあるドライバ
以下のドライバはMongoDB 3.6と互換性があります。
- Java 3.6
- Python 3.6
- C 1.9
- Node 3.0
DNSにより構成されるシードリスト形式 mongodb+srv
標準的なコネクション形式に加えて、3.6のドライバはDNSにより構成されるシードリスト形式をサポートします。詳細はDNS Seedlist Connection Formatを参照してください。
Change Streams
MongoDB 3.6では、レプリカセット、および、レプリカセットと組み合わせたシャードクラスタに対して、change streamを作成することができるようになりました。
change streamにより、oplogを追跡する複雑性・リスクを避けながら、リアルタイムにデータ変更の通知を受けることができるようになりました。
3.6系ドライバであればいずれも、db.collection.watch()メソッドを使うことでchange streamを作成することができます。完全な手順や使い方は、それぞれのドライバのドキュメントを参照してください。
詳細はChange Streamsを参照してください。
change streamを使うためには、
featureCompatibilityVersion
は"3.6"である必要があります。詳細はFeatureCompatibilityVersionを確認する方法もしくはsetFeatureCompatibilityVersionを参照してください。クライアントセッション
因果一貫性(Causal Consistency)
因果一貫性1を提供するため、MongoDB 3.6ではクライアントセッションにおいてcausal consistencyを有効にしています。因果一貫なクライアントセッションは、関連付けられた読み込みおよび ack済みの 書き込みの一連のオペレーションが因果関係を持つ、つまり順序通り反映されることを示します。クライアントアプリケーションは、一度に1つのスレッドだけがクライアントセッションでこれらの操作を実行するようにする必要があります。
アプリケーションはクライアントセッションを開始し、特定のセッションにオペレーションを関連付けることができます。アプリケーションは一度に1つのスレッドだけがクライアントセッションでこれらの操作を実行するようにする必要があります。2
クライアントセッションを使うためには:
- クライアントには、3.6用に更新されたドライバが必要です。Java、C#、Python、Node、Cなど。
- featureCompatibilityVersionは"3.6"である必要があります。詳細はFeatureCompatibilityVersionを確認する方法もしくはsetFeatureCompatibilityVersionを参照してください。
リトライ可能な書き込み
リトライ可能な書き込みを使うためには:
- クライアントには、3.6用に更新されたドライバが必要です。Java、C#、Python、Node、Cなど。
- featureCompatibilityVersionは"3.6"である必要があります。詳細はFeatureCompatibilityVersionを確認する方法もしくはsetFeatureCompatibilityVersionを参照してください。
MongoDB 3.6 から、レプリカセットとシャードクラスタに対する特定のack済みオペレーションは、一時的なネットワーク障害やレプリカセットのマスタ選出を適切に処理するため「リトライ可能」となりました。
リトライ可能な書き込み機能により、MongoDBのドライバは、ネットワーク障害やレプリカセットのファイルオーバー(その間レプリカセットにはプライマリが存在しなくなる)に遭遇した場合、自動的にこれらのオペレーションをリトライします。3.6ドライバでリトライ可能な書き込みを有効にするには、retryWritesを参照してください。
リトライはただ1回だけ試みられるので、リトライ可能機能は一時的なネットワーク障害にのみ対応可能で、永続的なネットワーク障害には対応できません。
リトライ可能な書き込みについて詳細は、Retryable Writesを参照してください。
mongo シェルの変更
MongoDB 3.6では、mongoシェルに対し--retryWritesコマンドラインオプションが追加されました。このオプションにより、mongoシェルにおいてリトライ可能な書き込みが有効になります。
mongoシェルにおけるMongo()コネクションオブジェクトに、以下のメソッドが追加されました。
- Mongo.isCausalConsistency()
- Mongo.startSession()
- さまざまな Session メソッド
- さまざまな SessionOptions メソッド
サーバセッション
MongoDBのサーバセッション(または論理セッションともいう)は、クライアントセッションにおいて因果一貫性(Causal Consistency)やリトライ可能な書き込みをサポートするための、基盤となるフレームワークです。
アプリケーションは、クライアントセッションを使用してサーバセッションとのインターフェースを行います。
サーバセッションはスタンドアロンmongod、レプリカセット、シャードクラスタにおいて利用可能です。
サーバセッションのコマンド
3.6から、MongoDBのドライバは、ackされていない書き込みを除き、すべてのオペレーションをサーバセッションと関連付けるようになりました。環境構成が認証/認可を強制している場合は、サーバセッションは認証済みユーザと関連付けられます。
MongoDBクラスタのサーバセッションを、列挙、管理、killするために、以下のコマンドが利用可能です。
Commands | 説明 |
---|---|
endSessions | 指定のサーバセッションを終了します。 |
killAllSessions | すべてのサーバセッションをkillします。 |
killAllSessionsByPattern | 指定のパターンに一致するサーバセッションすべてをkillします。 |
killSessions | 指定のサーバセッションをkillします。 |
refreshSessions | アイドル状態のサーバセッションをリフレッシュします。 |
startSession | 新しいサーバセッションを開始します。 |
パラメータ
サーバセッションに対し以下の新しいパラメータが利用可能です。
Aggregationステージ
サーバセッションをサポートするため、MongoDB 3.6では、以下のAggregationパイプラインステージが追加されました。
Operator | 説明 |
---|---|
$listSessions |
config データベースのsystem.sessions コレクションの中のサーバセッションを列挙します。 |
$listLocalSessions | サーバによりメモリ中にキャッシュされているセッションを列挙します。db.aggregate()という新しいaggregationヘルパーを使用します。 |
一般的な事項
serverStatusは、logicalSessionRecordCacheの数に関する情報を返します。
コマンドオプション
3.6から、MongoDBのドライバは、ackされていない書き込みを除き、すべてのオペレーションをサーバセッションと関連付けるようになりました。すべてのコマンドにおいてサーバセッションとの関連付けをサポートするために以下のオプションが利用可能です。
mongoシェルとドライバはこれらのオプションをセッション中のコマンドに割り当てます。
Option | Type | 説明 |
---|---|---|
lsid |
Document | コマンドに関連付けられたセッションのユニークなidを指定するDocumentです。txnNumber が指定されている場合は、lsid も必須です。 |
txnNumber |
64bitの整数 | コマンドのセッションにおいて、コマンドを一意に識別するための、狭義単調増加する非負の整数です。 このオプションが指定された場合は、 lsid も必須です。 |
ステートメントの配列をとるdelete、insert、updateコマンドのために、以下のオプションも利用可能です。
stmtIds
を手動で設定しないでください。MongoDBによってstmtIds
は狭義単調増加となるように設定されます。Option | Type | 説明 |
---|---|---|
stmtIds |
32bit整数の配列 | 書き込みコマンドにおける各書き込みオペレーションをそれぞれ一意に識別する数値の配列です。 |
JSON Schema
MongoDB 3.6は、JSON Schemaを使ったドキュメントバリデーションをサポートするため $jsonSchema オペレータを追加しました。詳細は $jsonSchema を参照してください。
$jsonSchemaを使うには、featureCompatibilityVersion
は "3.6" にセットされている必要があります。
後方非互換な機能
レプリカセット
- レプリカセットのprotocol version 0(
pv0
)は非推奨となりました。レプリカセットのprotocol versionについて詳細は、Replica Set Protocol Versionsを参照してください。 - replSetResizeOplogコマンドが追加され、レプリカセットのメンバーのoplogサイズを動的に変更できるようになりました。WiredTigerストレージエンジンを実行しているインスタンスにおいて利用可能です。
- catchUpTakeoverDelayMillis 設定オプションが追加され、あるノードが現在のプライマリよりも先にあることが決定されたあと、プライマリ選出のためにどのぐらいの時間待機するかを指定できるようになりました。
- protocol version 1(
pv1
)を使っているレプリカセットでは、アービタは、次の候補者以上の優先度をもつ正常なプライマリを検出している場合、NOを投票します。レプリカセットのprotocol versionについての詳細はReplica Set Protocol Versionsを参照してください。 - レプリカセットのメンバーが、データ同期の実行中にfindコマンドをどのくらいの時間待つべきかを調節するため、oplogInitialFindMaxSecondsパラメータが追加されました。
-
afterClusterTime
がoplogの最終適用時刻よりも大きい場合に、セカンダリがどのぐらいの時間待つべきかを指定するため、waitForSecondaryBeforeNoopWriteMSパラメータが追加されました。
シャードクラスタ
- mongosがmongodに対してのコネクションを追加する速度を制御するため、mongosにShardingTaskExecutorPoolMaxConnecting パラメータが追加されました。
- マイグレーションされたチャンクが元のシャードから削除されるまでの最小の時間を決める orphanCleanupDelaySecs が追加されました。
-
config
データベースの中のconfig.system.sessions
コレクションは、シャード化可能となりました。
一般的な改善
MongoDB Compass のパッケージング
MongoDBサーバは、MongoDB Compass Community Editionの各プラットフォーム向けインストールスクリプトとともにパッケージ化されます。このスクリプトはMongoDBサーバのインストールプロセスの一環としてMongoDB Compassをインストールします。
コレクション識別子
コレクションは、不変の一意な識別子を持ちます。featureCompatibilityVersion
が "3.6" に設定されている必要があります。
後方非互換な機能
新しいクエリオペレータ
MongoDB 3.6では、以下の新たなクエリオペレータが追加されました。
- 新しい $jsonSchema オペレータは、指定されたJSON Schemaで検証済みとなったドキュメントにマッチします。$jsonSchemaを使うには、
featureCompatibilityVersion
は "3.6" に設定されている必要があります。 - $exprにより、クエリ言語内で集計式が使えるようになりました。
削除されたオペレータ
MongoDB 3.6では、非推奨であった $pushAll
オペレータが削除されました。詳細はRemove $pushAll Update Operatorを参照してください。
インデックス
- インデックスは、入れ子になったドキュメント内のフィールドに対するクエリをカバー可能となりました。
- 複数キーインデックスは、どのフィールドが複数キーの原因となっているのかインデックスが追跡している場合には、配列以外のキーに対するクエリをカバー可能となりました。
- インデックスを作成するときは、インデックスの名前として
*
を指定することはできません。詳細はIndexes Named*
を参照してください。
コマンド
-
listDatabasesコマンドに以下のオプションが追加されました。
-
nameOnly
は、データベース名のみを返します。この場合はデータベースロックは不要です。(データベース名とサイズ情報の両方を返す場合は、データベースロックが必要となってしまいます。) -
filter
は指定条件に合致するデータベースのみを出力します。
-
- validateコマンドおよびdb.collection.validate()メソッドの振る舞いが、変更されました。
Wire Protocol と圧縮
- MongoDB 3.6では OP_MSG という新たなWire Protocolのopcodeが導入されました。このopcodeのメッセージフォーマットは拡張可能であり、他のopcodeの機能を包含するように設計されています。
-
--networkMessageCompressors
オプション(または設定ファイル中のnet.compression.compressors)で利用するためのzlib
圧縮が追加されました。--networkMessageCompressors
オプション(またはnet.compression.compressorsの設定)はmongod、mongos、mongoシェル、OP_COMPRESSED
メッセージフォーマットをサポートするドライバの間でのネットワーク圧縮を有効化します。 -
snappy
ネットワーク圧縮がmongod、mongos、mongoシェルの間でデフォルトで有効になりました。
Read Concern
- 新たに "available"というRead Concernが導入されました。非シャード化コレクション(つまり、スタンドアロン環境か、レプリカセット環境)では、"local"と"available"のRead Concernは同じようにふるまいます。シャードクラスタでは、"available"はクラスタパーティションに対してより強い耐性を持ちますが、チャンクマイグレーション中のシャードはorphan documentsを返す可能性があります。
- "majority" read concernが常に有効化されました。これに伴い、--enableMajorityReadConcern と replication.enableMajorityReadConcern は非推奨化されました。
FTDC
MongoDB 3.6では、mongosでDiagnostics Capture(FTDCともいわれる)の出力が追加されました。以前のバージョンでは、この機能はmongodのみで利用可能でした。Diagnostic Parametersを参照してください。
FTDCはデフォルトで有効になっています。
追加の改善点
MongoDB 3.6は以下の改善を含みます。
- --bind_ip オプションにおいて、Unixドメインソケットの完全なパスを指定できるようになりました。
-
mongod は新たに --timeZoneInfo オプションを指定できるようになりました。タイムゾーンデータを指定するために使ってください。LinuxとmacOS向けのデフォルト設定では、
/usr/share/zoneinfo
にセットされています。 - 日付に関するオペレーションは、サポートされているすべてのオペレーティングシステムにおいて、日付範囲を一貫して受け入れられるようになりました。0年から9999年までの範囲の年を安全に扱うことができます。
- mongodに対するhonorSystemUmaskという新しい起動時オプションにより、MongoDBが新規作成するファイルはmongodプロセスを実行するユーザのumaskで指定される読み込み/書き込み権限を持つようになります。LinuxおよびmacOSでのみ有効です。
- データベースに対する maxWriteBatchSize の制限が、1000 から 100000 に拡張されました。これはある1つのwrite batchの中で許可される書き込みオペレーションの最大数です。
- データベースコマンド planCacheListPlans はシェルでのPlanCache.getPlansByQuery() メソッドと同じものを出力します。両者からの出力は、プランが生成された時点のタイムスタンプを含むようになりました。
- KeysRotationIntervalSecという新しいサーバパラメータによりHMAC署名鍵がローテーションするまでの秒数を指定できるようになりました。
互換性への影響
いくつかの変更点は互換性に影響する可能性があり、ユーザーの対応が必要になるかもしれません。詳細な一覧はMongoDB 3.6での互換性の変更点を参照してください。
アップグレードの手順
3.4のインスタンスをアップグレードするためには、3.4のインスタンスは
featureCompatibilityVersion
が3.4に設定されている必要があります。詳細はFeatureCompatibilityVersionを確認する方法もしくはsetFeatureCompatibilityVersionを参照してください。アップグレードの手順については、以下を参照してください。
3.6へのアップグレードで支援が必要な場合は、MongoDB社はメジャーバージョンアップグレードサービスを提供しています。これは、あなたのアプリケーションを停止させることなく円滑な移行ができるように支援するものです。
ダウンロード
MongoDB 3.6をダウンロードするには、MongoDB Download Centerを参照してください。
3.6.0での既知の問題点
-
SEVER-31760:
$exprが、外部パイプラインで$lookup aggregationステージの一部として使用される場合など、フィールドに対する等価一致でインデックスを使用しません。 -
TOOLS-1827:
SRVでURIを使用する場合、コマンドラインURIでクエリパラメータが指定されていない場合、フェッチされたTXTレコードは無視されます。これを回避するには、URIクエリ文字列で、データベースとの通信に使用するSSL設定(ssl=trueまたはssl=falseのいずれか)を明示的に指定します。 -
WT-3724:
MongoDB 3.6は、macOS 10.13の新しいファイルシステムであるAPFS上ではテストされておらず、エラーが発生するかもしれません。
問題を報告する
問題を報告するためには https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports を参照してください。MongoDBサーバや、関連プロジェクトについて、JIRAチケットを登録する方法が書いてあります。
-
Causal Consistency https://en.wikipedia.org/wiki/Causal_consistency http://www.cs.princeton.edu/~wlloyd/papers/causal-login13.pdf ↩
-
原文でも同じことを書いている。 ↩