如何使用 Azure DocumentDB 执行 UPSERT?

2024-01-08

Azure DocumentDB 不支持 UPSERT。是否有合理的解决方法来实现相同的功能?

使用存储过程检查文档是否存在以确定是否应该执行插入或更新是否是一种有效的策略?

如果我需要批量执行数千个这样的操作怎么办?


在这里为该功能投票:

http://feedback.azure.com/forums/263030-documentdb/suggestions/7075256-provide-for-upsert http://feedback.azure.com/forums/263030-documentdb/suggestions/7075256-provide-for-upsert


Update- 这是我尝试批量更新插入存储过程。

function bulkImport(docs) { 
    var collection = getContext().getCollection(); 
    var collectionLink = collection.getSelfLink(); 
    var count = 0; 

    if (!docs) throw new Error('Docs parameter is null'); 

    var docsLength = docs.length; 
    if (docsLength == 0) { 
        getContext().getResponse().setBody(0); 
    } 

    tryUpsert(docs[count], callback); 

    function tryUpsert(doc, callback) {

        var query = { query: ""select * from root r where r.id = @id"", parameters: [ {name: ""@id"", value: doc.id}]};

        var isAccepted = collection.queryDocuments(collectionLink, query, function(err, resources, options) {
            if (err) throw err;                           

            if(resources.length > 0) {
                // Perform a replace       
                var isAccepted = collection.replaceDocument(resources[0]._self, doc, callback);     
                if (!isAccepted) getContext().getResponse().setBody(count);                          
            }
            else {
                // Perform a create
                var isAccepted = collection.createDocument(collectionLink, doc, callback);   
                if (!isAccepted) getContext().getResponse().setBody(count);                             
            }
        });  

        if (!isAccepted) getContext().getResponse().setBody(count); 
    }

    function callback(err, doc, options) { 
        if (err) throw err; 

        // One more document has been inserted, increment the count. 
        count++; 

        if (count >= docsLength) { 
            // If we have created all documents, we are done. Just set the response. 
            getContext().getResponse().setBody(count); 
        } else { 
            // Create next document. 
            tryUpsert(docs[count], callback); 
        } 
    } 
} 

更新(2015-10-06): 原子更新插入 https://azure.microsoft.com/en-us/blog/documentdb-adds-upsert/Azure DocumentDB 现在支持。


是的,存储过程非常适合更新插入。

DocumentDB 的 Github 上甚至还提供了代码示例:

  • 更新插入(针对插入进行了优化):https://github.com/aliuy/azure-node-samples/blob/master/documentdb-server-side-js/stored-procedures/upsert.js https://github.com/aliuy/azure-node-samples/blob/master/documentdb-server-side-js/stored-procedures/upsert.js

  • 更新插入(针对替换进行了优化):https://github.com/aliuy/azure-node-samples/blob/master/documentdb-server-side-js/stored-procedures/upsertOptimizedForReplace.js https://github.com/aliuy/azure-node-samples/blob/master/documentdb-server-side-js/stored-procedures/upsertOptimizedForReplace.js

  • 批量导入/更新插入:https://github.com/Azure/azure-documentdb-hadoop/blob/master/src/BulkImportScript.js https://github.com/Azure/azure-documentdb-hadoop/blob/master/src/BulkImportScript.js

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Azure DocumentDB 执行 UPSERT? 的相关文章

随机推荐

  • SQL:连接两个表,其中列为空

    我正在使用mysql数据库 我有两个表错误和配置文件 Bugs 表有两列 signed to qa contact 通过多对一关系指向配置文件 这些是我的查询的简化版本 首先 我试图这样做 但它返回重复的行 其中 bugs 表中 qa co
  • 在 Windows 的 virtualenv 中安装 lxml

    我最近开始使用 virtualenv 并且想在这个隔离环境中安装 lxml 通常我会使用 Windows 二进制安装程序 但我想在此 virtualenv 中使用 lxml 不是全局 Pip install 不适用于 lxml 所以我不知道
  • Entity Framework Core Linq 查询来过滤相关实体

    我已经弄清楚如何在使用 Include 时编写通过 Entity Framework Core 过滤相关实体的查询很长时间 假设我有以下两个类 public class Order public int OrderId get set pu
  • 如何在 Angular 中触发文件上传输入?

    如何在 Angular 4 中触发文件上传输入 我正在尝试 但它不起作用 我必须单击 div 并触发输入类型按钮 而不是输入按钮 应用程序 html
  • 如何在 tkinter 应用程序执行期间禁用“D_Lib”信息/警告消息?

    我正在开发一个 python tkinter 应用程序PyCharm 2017 1 2 Community Edition并将软件打包为pyinstaller 3 2 1 在应用程序运行时 有时 尚未找到根本原因事件 我会将此信息 警告消息
  • 更改 Jenkins 内部版本号

    有没有办法更改作业完成后通过电子邮件发送的内部版本号 问题是产品构建不是由 Jenkins 完成的 因此我们希望能够获取构建号 即从文本文件中 并更新 Jenkins 中的构建号以匹配它 我尝试设置内部版本号 set BUILD NUMBE
  • SpringMVC 3.0到3.1的ControllerClassNameHandlerMapping迁移

    我在 Spring 3 0 中有一个现有应用程序 它使用 ControllerClassNameHandlerMapping 来映射控制器和方法 例如 StartController class is mapped to http 127
  • 如何将框阴影应用于相邻元素而不出现重叠?

    给定这个 html div div
  • TensorFlow protobuf 版本不匹配

    我已经通过安装 TensorFlowvirtualenv 而且效果很好 现在我想使用 C 加载模型并进行预测 但由于 protobuf 版本不匹配 我无法编译我的程序 错误如 tensorflow core framework device
  • 使用 Jenkins 管道构建 Docker 映像时如何解决“无法从 docker 检索 .Id”

    我正在使用 Jenkins 管道来构建 Dockerfile dockerfile 成功完成所有步骤 并创建 docker 映像 如图所示 Step 16 19 FROM base AS final gt
  • iOS 内存使用量不断增长

    我目前正在开发一款不久前开始的游戏 进展顺利 一切都运行顺利 但我决定尝试使用 XCode Instruments 来检查代码中是否存在任何泄漏 我正在使用 ARC 只有当其他对象被删除时才会添加新对象 我的游戏内部工作的一部分 但总内存大
  • Qt QAbstractItemModel - 项目删除崩溃

    我正在使用 Qt 类编写一个应用程序 其中我有一个层次结构 并且需要在树视图中显示它 我正在使用 QTreeView 小部件 数据本身如下所示 class StatisticsEntry additional data management
  • 如何在 vim 中操作搜索和替换中的字符大小写?

    例如 我有 double foo 0 0 double bar 0 0 我想编写某种搜索来查找每个变量并将其更改为 double Foo 0 0 double Bar 0 0 我不想一次执行这些一个变量 例如 s foo Foo g 而是一
  • Spring Boot 应用程序 + Kubernetes 活跃性/就绪性检查

    我正在构建一些部署在 Kubernetes 特别是 AKS 集群中的 Spring Boot 微服务 我正计划设置probePaths活跃度和准备度检查执行器运行状况端点的两个点 但想知道这是否不是最佳选择 我最初的想法是 检查路径会很有用
  • 如何使用 AngularJS 观察控制器中的原始服务变量?

    我正在尝试使用 watch 来实现它 watch 主体在页面初始化时触发 在 newValue 中未定义 并且在单击 btnChangeIsLoggedIn 时不触发 div div
  • 使用 Azuredevops 管道批量更新 Azure 资源标签

    我按照答案创建了一个管道here https stackoverflow com questions 74684267 how to loop inside one object type parameters again in azure
  • Javascript 中的 C 解析器

    我想用 Javascript 解析 C 头文件 有这样的图书馆吗 否则 有什么建议可以帮助我开始吗 Update 我的最终目标是自动构建接口node ffi https github com rbranson node ffi 解析器不一定
  • C++ 如何查看文件的最后修改时间

    我正在缓存文件中的一些信息 并且希望能够定期检查文件的内容是否已被修改 以便我可以在需要时再次读取该文件以获取新内容 这就是为什么我想知道是否有一种方法可以在 C 中获取文件的上次修改时间 没有特定于语言的方法可以做到这一点 但是操作系统提
  • 如何从MySQL旧密码升级到新密码系统

    我在 mysql server 5 0 中有很多用户 权限 我想将它们全部转移到新的 MySQL 服务器 5 5 中 但密码是旧格式 在 mysql user 表中 所以我想将所有旧密码转换为新格式 有没有办法在不更改MySQL密码的情况下
  • 如何使用 Azure DocumentDB 执行 UPSERT?

    Azure DocumentDB 不支持 UPSERT 是否有合理的解决方法来实现相同的功能 使用存储过程检查文档是否存在以确定是否应该执行插入或更新是否是一种有效的策略 如果我需要批量执行数千个这样的操作怎么办 在这里为该功能投票 htt