TKC Works

ギジュツ的なメモ、読書感想文など

Azure CosmosDBとFunctionsのbind & multi insert

速度もデータ量も要求されている時にはAzure Cosmos DBを使いたい。

FunctionsとCosmosDBの統合は公式にサポートされているのでいい感じにサーバーレスな仕組みが作れるかと思った。 が、ドキュメントを見ると1件ずつしかinsertできない。

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-cosmosdb

やりたいのは↑のサンプルみたいにHTTPトリガーで1件ずつのinsertじゃなくてIoTHubとかEventHubとかと統合して大量データを一気に保存すること。

SDK見てみると、どうやらmulti insertは無いらしい..

Stream Analyticsを使うとできそうだけど、今回はCosmosDBのストアドプロシージャも試してみた。

ストアドプロシージャのコードはほぼ以下の通り、

https://stackoverflow.com/questions/28769507/azure-documentdb-bulk-insert-using-stored-procedure

getContext() からCollection, Request, Responseのオブジェクトを取得して処理を行う。

http://azure.github.io/azure-documentdb-js-server/index.html

クライアント側はこんな感じのコードをFunctionsに書いてやればよい。

const DocumentClient = require('documentdb').DocumentClient

// このリンクのルールを理解するまではこのSDKで何も出来ない…
const sprocLink = `dbs/${dbId}/colls/${collectionId}/sprocs/${spId}`

const client = new DocumentClient(host, {masterKey: masterKey})

// Arrayをいれるとエラーになったので対策
const sendData = {
  docs: []
}

client.executeStoredProcedure(sprocLink, sendData, (err, res) => {
  context.log(err, res)
  context.done()
})