1923

都内と業界の隅っこで生活しているエンジニアのノート

Cosmos DBでバルクアップデート

追加でCosmos DBのバルクアップデート。
複数のidに対して同じ値で更新する簡単なストアドです。取得・更新を1件ごとにREST APIで処理すると12RU/件前後(IDで取得=1, 更新=11)。10件程度をストアドで一括更新したときは75.18でした。やはりお得ですね。

bulkUpdate.js

function bulkUpdate(keys, value) {
    var context = getContext();
    var collection = context.getCollection();
    var collectionLink = collection.getSelfLink();
    if (!keys) throw new Error("The array is undefined or null.");

    var count = 0;
    var query = "SELECT * from root r WHERE r.id IN " + keys;
    collection.queryDocuments(collectionLink,
        query,
        function (err, docs) {
            if (err) throw new Error(err.message);
            for (var i = 0; i < docs.length; i++) {
                docs[i].JobTitle = value;
                tryUpdate(docs[i])
            }
            context.getResponse().setBody(count);
        });

    function tryUpdate(doc) {
        var isAccepted = collection.replaceDocument(doc._self, doc);
        if (!isAccepted) context.getResponse().setBody(count);

        count++;
    }
      
}

ステータスの一括更新的な用途で使用したかったのですが、サンプルデータにステータスがなかったので、idの1から10までをCEOにしてしまいましょう。

PowerShell

$json = "[[""('1', '2', '3', '4', '5', '6', '7', '8', '9', '10')""], [""Chief Executive Officer""]]"
exec -EndPoint $endPoint -DataBaseId $dataBaseId -MasterKey $keys.primaryMasterKey -ResourceType "sprocs" -ResourceLink "dbs/$databaseId/colls/$collectionId/sprocs/$storedProcedureId" -BodyJson $json -Uri "dbs/$databaseId/colls/$collectionId/sprocs/$storedProcedureId"

execなどはここと同じ