【问题标题】:Azure CosmosDB stored procedure to update all items' fieldAzure CosmosDB 存储过程以更新所有项目的字段
【发布时间】:2021-05-12 15:39:21
【问题描述】:

假设我们有一个包含以下项目的容器

{
  location:CA,
  bool: false
}

{
  location:CA,
  bool: false
}

{
  location:CA,
  bool: false
}

我们如何编写一个存储过程来查询所有项目并将所有项目的 bool 字段从 false 更新为 true?我还没有找到任何参考资料,我知道 CosmosDB 存储过程只支持查询,不支持更新或删除。

【问题讨论】:

  • 你的分区键是什么? /id?并且 Cosmos DB 存储过程支持更新和删除。
  • @SteveZhao 是的,分区键是 id。
  • 存储过程无法满足您的要求。您可以通过 SDK 做到这一点。
  • @SteveZhao 存储过程不能完成这么简单的任务吗?只更新 1 个项目怎么样?您不需要完全“更新”吗?您可以通过替换整个文档来“更新”?
  • 因为存储过程的范围是逻辑分区。在您的情况下,您有三个逻辑分区。只需更新 1 项即可。

标签: azure stored-procedures azure-cosmosdb azure-cosmosdb-sqlapi azure-cosmosdb-tables


【解决方案1】:

这个存储过程代码:

// SAMPLE STORED PROCEDURE
function sample() {
    var collection = getContext().getCollection();

    // Query all documents in one logic partition
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT * FROM root r',
    function (err, feed, options) {
        if (err) throw err;

        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            feed.forEach(element => {
                element.bool = true;
                collection.replaceDocument(element._self, element,function (err){
                    if (err) throw err;
                })
            })
            var response = getContext().getResponse();
            response.setBody("replace success");
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

执行存储过程:

顺便说一句,你的分区键应该是/location

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多