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句は現時点ではサポートしていません(かなりアツい要望は多数あるようです。私も欲しい)。