MongoDB

MongoDB 3.6 Release Notes 翻訳

Release Notes for MongoDB 3.6の翻訳です。原文はMongoDB Documentation Teamによるものです。ライセンスはCC BY-NC-SA 3.0となっています。

CONTRIBUTING.rst

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オプション

    注意:

    hint$lookup$graphLookupステージには適用されません。
  • データベースプロファイラ、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

重要:
クライアントセッションを使うためには:

リトライ可能な書き込み

重要:
リトライ可能な書き込みを使うためには:

MongoDB 3.6 から、レプリカセットとシャードクラスタに対する特定のack済みオペレーションは、一時的なネットワーク障害やレプリカセットのマスタ選出を適切に処理するため「リトライ可能」となりました。

リトライ可能な書き込み機能により、MongoDBのドライバは、ネットワーク障害やレプリカセットのファイルオーバー(その間レプリカセットにはプライマリが存在しなくなる)に遭遇した場合、自動的にこれらのオペレーションをリトライします。3.6ドライバでリトライ可能な書き込みを有効にするには、retryWritesを参照してください。

リトライはただ1回だけ試みられるので、リトライ可能機能は一時的なネットワーク障害にのみ対応可能で、永続的なネットワーク障害には対応できません。

リトライ可能な書き込みについて詳細は、Retryable Writesを参照してください。

mongo シェルの変更

MongoDB 3.6では、mongoシェルに対し--retryWritesコマンドラインオプションが追加されました。このオプションにより、mongoシェルにおいてリトライ可能な書き込みが有効になります。

mongoシェルにおけるMongo()コネクションオブジェクトに、以下のメソッドが追加されました。

サーバセッション

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も必須です。

ステートメントの配列をとるdeleteinsertupdateコマンドのために、以下のオプションも利用可能です。

重要:
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パラメータが追加されました。

シャードクラスタ

  • mongosmongodに対してのコネクションを追加する速度を制御するため、mongosShardingTaskExecutorPoolMaxConnecting パラメータが追加されました。
  • マイグレーションされたチャンクが元のシャードから削除されるまでの最小の時間を決める 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の設定)はmongodmongosmongoシェル、OP_COMPRESSEDメッセージフォーマットをサポートするドライバの間でのネットワーク圧縮を有効化します。
  • snappyネットワーク圧縮がmongodmongosmongoシェルの間でデフォルトで有効になりました。

Read Concern

  • 新たに "available"というRead Concernが導入されました。非シャード化コレクション(つまり、スタンドアロン環境か、レプリカセット環境)では、"local""available"のRead Concernは同じようにふるまいます。シャードクラスタでは、"available"はクラスタパーティションに対してより強い耐性を持ちますが、チャンクマイグレーション中のシャードはorphan documentsを返す可能性があります。


  • "majority" read concernが常に有効化されました。これに伴い、--enableMajorityReadConcernreplication.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チケットを登録する方法が書いてあります。