MongoDB 3.2の新機能を先取りチェック
MongoDB 3.2の新機能について言及している記事を読んだので、簡単に要約を書く。
MongoDB 3.2の新機能を早送りで見てみよう
MongoDB 3.2は2015年の終わりにリリースされる見込みだということが、MongoDB Worldで報告されました。新機能を見てみますが、開発中なのでリリースまでには変更する可能性があります。
今回はこの3つについて見てみます。
- ドキュメント バリデーション
- Partial Index
- Aggregationでjoin ($lookup)
カンファレンスではスキーマについて多くの話がありました。MongoDBはこれまでスキーマレスを売りにプロモーションされてきたので、スキーマについて言及されることは奇妙に見えます。これは、MongoDB, Incがデータベースに格納された文書への規則的な構造を再評価していることなのでしょうか。
MongoDBのエンタープライズツールではscans collectionsやeverse engineers a schema from the collectionsなど、スキーマについてのものがリリースされています。これらは3.2で、コレクションをより便利で整然とするための新機能への提案になるでしょう。
1. ドキュメント バリデーション
[SERVER-18227] Document Validation - MongoDB
3.1.3でリリース済み
コレクションと条件式を指定するシンプルな形のバリデーションです。バリデーションにパスしなかったら error 121 DocumentValidationFailureを出します。
条件式は、greater than, less than, existsなどの式が使えますが、今のところgeo nearやtext search, whereは使えません。
db.runCommand({"collMod": collName, "validator" : {a: {$exists: true}}})
注意点。すでに存在しているコレクションのvalidateはできない。insert, update時のみ。
2. Partial Indexes
JIRAチケット: System Dashboard - MongoDB
3.1 RequiredでOpenだが、3.1.5で試したところ動いた。
2010年からJIRAに登録されている課題で、スキーマに関する新機能。filter expressionをパスしたドキュメントのみがindexされる仕組み。
db.myusercoll.createIndex({ name: 1 }, { partialFilterExpression: { status: { $eq: "active" } } } )
ユーザーをactive, inactiveというステータスで管理している状況を考える。例えばsoft remove実装。 上記のクエリを流すと、activeなユーザーのみがnameでindexされる。
巨大なデータでのパフォーマンス改善になるだろう。filterにマッチしなかったドキュメントはクエリーでスキップされるだけではなく、insert やupdate時のindexingもスキップされる。
3. Aggregationでjoin ($lookup)
JIRAチケット: [SERVER-19095] $lookup - MongoDB
3.1.6でリリース予定
Aggregationフレームワークで、コレクション間のjoinに関する機能。普段の業務でjoinは使わなくても、analyseで使いたくなる時がある。MongoDB, Incはこれまでそのような場合は非正規化をするようにアドバイスしてきた。
これまでのAggregationフレームワークでは、単一のコレクションについてのパイプラインしか実行できなかったが、新機能の$lookupオペレータでは他のコレクションのデータを取得できるようになる。言い換えると、Aggregationステージでleft outer join機能を提供する。
$lookupは大きなポテンシャルを秘めているだろう。ユーザーはデータを非正規化しなくてもよくなる。ただ、実際にどのくらい使える機能なのかはalpha/beta版のリリースを待たなければならない。
まとめ
これらの3つの新機能は、サーバーサイドのMongoDBアーキテクチャにとって課題だった点への取り組みである。MongoDB 3.2 alpha/betaがリリースされた時、その改善を目に出来るだろう。3.2での他の変更点のほとんどはストレージエンジン、認証、他ツールとの連携とレプリケーションである。今後、残りの新機能についても取り上げていく。