2016-08-16

AzureのDocumentDBをMongoDBのドライバで使ってみる

正直なところ使っている人を見たことがないサービスなんですが、MicrosoftのAzureにはNoSQLサービスとしてDocuementDBというものがあります。AWSでいうところのDynamoDBに当たります。 このDocumentDB、MS社が提供しているNode.jsのライブラリが非常に使いづらく実用には耐えません。また、二つほどのコミュニティベースのライブラリがあるものの、それらもあまり品質がいいものではありませんでした。そして残念ながらRubyのライブラリもまだありません。

そんなDocumentDBですが、3ヶ月ほど前にMongoDBプロトコルに対応したとのニュースがありました。これはすなわちMongoDBように開発されたドライバやライブラリをそのまま使えるということです。まだAggregation機能は使えませんが、それ以外の機能の多くは実装済みとなっており、高速かつオートスケーリング機能つきのMongoDBサービスとして十分に使えます。 DocumentDBのライブラリは数少ないですが、MongoDBはすでにたくさんあり、RubyもCもPerlもScalaも公式のドライバが存在しています。

今回は日本語による情報がほとんどないこのDocumentDBをMongoDB用ライブラリで使ってみます。

DocuementDB - Protocol Support for MongoDBを選択し、しばらく待つとデプロイが完了します。 DocumentDBのMongoDBプロトコル対応はcompose.ioやmlab.comとは違い、あくまでもDocumentDBの仕組みの上にのっかったものです。なので使用料金の考え方が結構異なります。DocumentDBはテーブル一つあたりに課金される上、もっとも安い単価が24USDからとなります。mlabやcompose.ioではMongoDBサーバーの1インスタンスあたりに課金されるので、例えば10個のテーブルを必要とした場合にDocumentDBを使った場合に240USDもかかってしまいます。オートスケーリングできる点や、ほぼ無限のストレージ容量という利点はありますが、節約してサービスを運用したい場合には向いていません。 逆に一つだけのテーブルで事足りており、さらにそのテーブルへのReadWriteのスループットが重要視される場合には適しています。

それでは試しに使ってみましょう。 SettingsのブレードからConnection Stringが取得できます。これを使って普通のMongoDBとして使ってみましょう。 サンプル用のJSONファイルはVAT Ratesからダウンロードしました。

const url = 'mongodb://xxxxx:*****@xxxxx.documents.azure.com:10250/?ssl=true';
const data = require('./vat.json').rates;
const db = require('monk')(url);

const vat = db.create('vat');

vat.insert(data)
.then(_res => vat.findOne({name: 'France'})
.then(console.log);

monkを使ってデータをinsertし、入れたデータを適当に見てみると、出力は以下のようになります。

{ _id: 57b23594c427bf3f033459af,
  name: 'France',
  code: 'FR',
  country_code: 'FR',
  periods: [ { effective_from: '0000-01-01', rates: [Object] } ] }

MongoDBで見慣れたObjectIDも見えます。 もう少し複雑なクエリを投げてみます。

const vat = db.get('vat');

vat.find({name: {$regex: /ia$/}}, {sort: 'name', fields: {name: 1, _id: 0}})
.then(console.log);

とすると、

[ { name: 'Austria' },
  { name: 'Bulgaria' },
  { name: 'Croatia' },
  { name: 'Estonia' },
  { name: 'Latvia' },
  { name: 'Lithuania' },
  { name: 'Romania' },
  { name: 'Slovakia' },
  { name: 'Slovenia' } ]

となり、ソートやフィールドの指定もできました。

DBサーバーを適切に運用するのはかなりの経験が必要で、さらにあんまり楽しくありません。こういったサービスを上手に使って楽に運用していきたいですね。