MongoDB 4.0 リリースノートの要約

[MongoDB 4.0のリリースノート](https://docs.mongodb.com/manual/release-notes/4.0/)の要約しました。

直訳ではなく分かりやすいように適宜補足して訳しております。

また、一部細かい部分は割愛しています。

## 複数ドキュメントのトランザクション(Multi-Document Transactions)

MongoDB4.0から複数のドキュメントをatomicな操作として操作できる、multi-document transactionsがサポートされる。これはレプリカセットに対してのみ（※)有効。トランザクションの外側からはトランザクション内で変更途中のデータが見えない。

※)単一のmongodインスタンスではトランザクションは使えない。１つのmongodのみを含むレプリカセットを構築すればトランザクションは利用可能。

【重要】多くのケースにおいて、multi-document transactionsによる操作は、一つのドキュメントの更新よりもパフォーマンスが悪化する。また、multi-document transactionsをサポートしてからといって、今まで推奨してきた非正規化してデータを保持するスキーマデザインが置き換えられるというわけではない。つまり、multi-document transactionsを使うよりも、データの重複をあえて許容して一回の更新が一つのドキュメントで済むようにスキーマデザインでするほうが、多くのケースで最適である。すなはち、多くのケースでは、multi-document transactionsの利用を最小限に留めるべきである。

### トランザクションを使うにはfeatureCompatibilityVersionが4.0である必要がある

featureCompatibilityVersionは、古いバージョンのMongoDBと互換性のないデータを保持するかどうかの設定であり、トランザクションを使うには値が「4.0」に設定されている必要がある。つまり、3.6以前と互換性のないデータに変換しないと、トランザクション機能は利用できない。

ちなみに、以下の機能も利用にもfeatureCompatibilityVersionが「4.0」である必要がある。

* ハッシュ関数SCRAM-SHA-256
* AggregationにおけるtoBool等の変換機能
* $dateToString option changes
* 新しく追加された「change stream」

### mongoシェルでのトランザクションの使い方

* Session.startTransaction()	：multi-statement transactionを始める
* Session.commitTransaction()	：トランザクションをコミットするCommits the transaction.
* Session.abortTransaction()	：トランザクションをアボートする

### トランザクションの読み込みオプションであるRead Concern に新たに`snapshot` レベルを導入した

トランザクション使用時の読み込みオプションとして、Read Concern = snapshotが指定できるようになった。Read Concern = snapshotを指定したトランザクションは、「Write Concern = majorityで更新したトランザクション」がコミットしたデータのみを読み込むことを保証する。

※リリースノートあった記載では不十分であったため、[トランザクションの説明ページ](https://docs.mongodb.com/manual/core/transactions/#transaction-options-read-concern-write-concern)の説明から補足しています。


## aggregation関連

型変換や文字列操作の機能追加。その他詳細は割愛。

## MongoDB Drivers関連

いろいろな言語で最新バージョンのドライバをリリースした。詳細は割愛。

## Seucurity関連

ハッシュ化方式で SCRAM-SHA-256の追加。その他詳細は割愛。

## MMAPv1の非推奨化

MongoDBの古いストレージエンジンであるMMAPv1が非推奨となった。次のリリースでMMAPv1は無くなる。

## レプリカセット関連

* 古いレプリケーションプロトコルpv0の廃止
* 古いレプリケーション方式Master-Slaveレプリケーションの廃止
* `--nojournal`のオプションを指定できなくする

### rollback関係のエンハンス

まず初めに、MongoDBにおけるrollbackとは、RDBMSにおけるクラッシュリカバリ時のロールバックではないので注意が必要。
MongoDBにおけるrollbackとは、レプリケーションラグが発生している状態でプライマリが停止し、そのノードが復旧したときにすでにレプリカセット内では無かった事になっている更新（プライマリしか存在を知らない更新）を巻き戻す行為のことである。詳しくは[公式マニュアル](https://docs.mongodb.com/manual/core/replica-set-rollbacks/)参照。

そのrollbackに以下のエンハンスが入った。

#### `rollbackTimeLimitSecs`パラメータの導入

ロールバックに含める対象のドキュメントの秒数を指定できる。その秒数は、common point(レプリカ内のみんなが知っている更新時刻)からクラッシュしたプライマリに存在する更新ログ(oplog)の最新時間の差である。

※訳が分かりにくくてすみません。少し自信ないです。

#### Rollback Filesコマンドの導入

今まではrollbackによって「なかったことにされた更新」は、データディレクトリの中のとあるファイルに履かれていたが、MongoDB4.0からは`createRollbackDataFiles`によって、出力するかどうか制御できるようになった。

### レプリカセットのステータスコマンドの結果エンハンス

replSetGetStatus（いわゆるrs.status())の結果がよりリッチになった。詳細は割愛。

## Change Streamsの導入

change stream cursorという機能が追加され、データベースに対する変更のうち、システムで使うコレクション以外の変更を、捕捉できるカーソルが使えるようになった。
また全てのデータベースに対し変更を捕捉することもできる。

mongoシェルからの利用

* db.watch() 　特定データベースに対して変更を捕捉
* Mongo.watch()　全てのデータベースに対し変更を捕捉

## 無料のモニタリング（Free Monitoing）

クラウドで、単一ノードもしくはレプリカセットのモニタリングが無料でできる

db.enableFreeMonitoring()コマンドを打つだけで実行でき、ユニークなURLが発行される

## シャーディング関連

以下のコマンドの書き込み保証オプションがmajorityになった。majorityとはクラスタの過半数以上のノードでコマンドが完了するまでアプリケーションにOKを返さない待ち方である。

```
addShard　　　　　sh.addShard()	 
create　　　　　　db.createCollection()	 
drop　　　　　　　db.collection.drop()	 
dropDatabase　　　db.dropDatabase()
enableSharding　　sh.enableSharding()	 
movePrimary 	 
renameCollection　db.collection.renameCollection()	 
shardCollection　　sh.shardCollection()	 
removeShard	 
setFeatureCompatibilityVersion	 
```
## Windows向けの.msiインストラ

インストールの最中にWindowsのサービスの設定と開始ができるようになった

## Platform Support

対応プラットフォームが増えた。詳細は割愛。

## General Improvements

省略。