【Microsoft Azure】Azure Functions (Node.js) でCosmos DBのドキュメントを更新する

こんにちは。今日は、Azure Functionsを利用してCosmosDBの既存ドキュメントを更新する方法について整理しておこうと思います。

自分も2〜3時間ほどつまづいてようやく解決法に辿り着きました・・・

前提

  • HTTP Trigger
  • CosmosDBに対してInput/Output Bindingを構成
  • Node.js (14LTS)

CosmosDBの既存ドキュメントを更新する

以下のStack Overflowの記事を参考に、input bindingで更新対象のDocumentを取得してきた上で、そのDocumentに対して更新をかけることでうまくいきました。

(複数Documentを一括で更新するケースについては、また実装する機会があったときに記事にしようと思います)

https://stackoverflow.com/questions/44951972/how-can-i-update-data-in-cosmos-azure-nosql-using-azure-function-with-http-t

<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の既存ドキュメントを更新する方法でした。この記事が少しでもお役に立ちましたら、下のいいねボタンをポチっていただけますと励みになります!

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US

Yuu113
初めまして。Yuu113と申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。