Cosmos DB Binding
Azure Functions Cosmos DB bindingsというドキュメントが公開されていることに最近気がついたのですが、その中でも個人的に以前から密かに待望していた機能であるsqlQueryについて、とうとう公式に明記されました。
大変便利と思われるこの機能を早速試してみましたので、本エントリで紹介していきます。
なお、本エントリの前提知識として、以下のエントリを読んでおくことをお勧めします。
Azure DocumentDB inputを設定する
今回私が作った関数のfunction.jsonですが、DocumentDB inputの設定は以下のようになっております。よく見ると、sqlQueryに見慣れたSQLが記述されていますね。
これを標準エディタで見てみますと、以下のようになります。
sqlQueryの仕様
テーブル名を必ず指定する必要がある(ただし何でもOK)
気をつけなければいけない点として、フィールド名を指定する場合はテーブル名を指定する必要があるということです。
function.json
でコレクション名を指定してあるため、テーブル名そのものは何でもOKであり、特に何らかの影響を与えるわけではありません。このため、慣例的にテーブル名をc
とすることが多いようです。そのため、フィールド名name
を指定するためにはc.name
とする必要があります。
クエリバインド変数の指定方法
httpバインディングで受け付ける関数の場合、sqlQuery
に対して{name}
などとすることでクエリバインド変数を利用することが可能です。
例えば SELECT c.id FROM c WHERE c.type={type}
というsqlQuery
を指定した場合、getパラメータにtype=image
のように指定することで、type
がimage
であるドキュメントを全て持ってくることができます。
今回使ったデータ
今回の検証のために、あらかじめ別の関数を使ってCosmos DBに以下のようなドキュメントデータをいくつか登録しておきました。
関数のコーディング
普段ですとPerlやBashでコードを書いたりするのですが、今回はPHP7での実装事例を紹介します。
中身はこれしかありませんが、一応おさらいも兼ねて解説していきます。
1行目ですが、このコードはphpで動作するコードですので、Functionと言えど <?php
で開始する必要があります。
2行目ではfunction.json
で指定したsqlQuery
の結果を$message
に格納する処理を行っています。
getenv
の引数に指定する文字列は、function.json
で指定したname
と同じものを指定します。これによりgetenv
はCosmos DBから取得したJSONデータを内包した一時ファイルのパスを返します。あとはfile_get_contents
で中身を取り出し、json_decode
でstdClass
に復元してやることで、phpで自在に操作可能となります。
3行目はレスポンス処理を行っています。getenv
でレスポンス用の一時ファイルパスを取得し、そこにjson_encode
したデータをfile_put_contents
で書き込んでやるだけです。
実際にアクセスしてみる
以下は、GETパラメータにname=tago
をつけてリクエストを投げてみた結果です。
任意の絞り込みを行った結果を取得できていることがわかると思います。
まとめ
今回の検証で、Azure Functions + Cosmos DBを使ったSQLライクな問い合わせができることがわかりました。
ちなみにCosmos DBに対するクエリとして、既に一部の集計関数がサポートされています。ただし、GROUP BY
句は現時点ではサポートしていません(かなりアツい要望は多数あるようです。私も欲しい)。