こんにちは。今日は、Azure Functionsを利用してCosmosDBの既存ドキュメントを更新する方法について整理しておこうと思います。
自分も2〜3時間ほどつまづいてようやく解決法に辿り着きました・・・
前提
- HTTP Trigger
- CosmosDBに対してInput/Output Bindingを構成
- Node.js (14LTS)
CosmosDBの既存ドキュメントを更新する
以下のStack Overflowの記事を参考に、input bindingで更新対象のDocumentを取得してきた上で、そのDocumentに対して更新をかけることでうまくいきました。
(複数Documentを一括で更新するケースについては、また実装する機会があったときに記事にしようと思います)
<index.tsx>
var doc = context.bindings.inputDocument[0];
if (doc != null) {
context.log("DOCUMENT UPDATED")
doc."propertyName" = req.body."propertyName";
context.bindings.outputDocument = doc;
context.done()
}else{
context.log("DOCUMENT CREATED")
context.bindings.outputDocument = req.body;
context.done()
}
<functions.json>
{
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "cosmosDB",
"name": "inputDocument",
"databaseName": "XXXX",
"collectionName": "XXXX",
"connectionStringSetting": "XXXX",
"direction": "in",
"sqlQuery": "SELECT * from c where c.partitionKey = {partitionKey}"
},
{
"type": "http",
"direction": "out",
"name": "res"
},
{
"name": "outputDocument",
"type": "cosmosDB",
"databaseName": "XXXX",
"collectionName": "XXXX",
"createIfNotExists": true,
"connectionStringSetting": "XXXX",
"direction": "out"
}
],
"scriptFile": "../dist/XXXX/index.js"
}
なお、Output Bindingのみを使って一律で以下のように更新しようとすると、
context.bindings.outputDocument = req.body;
以下のエラーとともに409エラーが発生してしまいました。Upsertは、よしなにはやってくれないんですかねぇ・・
Entity with the specified id already exists in the system.
以上、Azure FunctionsでCosmosDBの既存ドキュメントを更新する方法でした。この記事が少しでもお役に立ちましたら、下のいいねボタンをポチっていただけますと励みになります!
おしまい
コメントを残す