当前位置: 首页 > 知识库问答 >
问题:

如何在Azure Cosmos DB上获得批量插入的延续令牌?

况博容
2023-03-14

我想上传一个CSV文件,该文件表示要以快速和原子的方式添加到我的Cosmos DB集合中的10k文档。我有一个类似以下伪代码的存储过程:

function createDocsFromCSV(csv_text) {
    function parse(txt) { // ... parsing code here ... }

    var collection = getContext().getCollection();
    var response = getContext().getResponse();

    var docs_to_create = parse(csv_text);
    for(var ii=0; ii<docs_to_create.length; ii++) {
        var accepted = collection.createDocument(collection.getSelfLink(),
                                                    docs_to_create[ii],
                                                    function(err, doc_created) {
                                                        if(err) throw new Error('Error' + err.message);
                                                    });
        if(!accepted) {
            throw new Error('Timed out creating document ' + ii);
        }
    }
}

当我运行它时,存储过程在超时之前创建了大约1200个文档(因此回滚并不创建任何文档)。

以前,我使用延续标记在存储过程中成功更新(而不是创建)数千个文档,此答案作为指导:https://stackoverflow.com/a/34761098/277504。但是在搜索文档(例如 https://azure.github.io/azure-documentdb-js-server/Collection.html)之后,我没有看到像查询文档那样通过创建文档来获取延续令牌的方法。

有没有办法利用存储过程来创建批量文档?

共有1个答案

单修德
2023-03-14

值得注意的是,存储过程有执行限制,所有操作必须在服务器指定的请求超时期限内完成。如果操作没有在该时间限制内完成,事务将自动回滚。

为了简化开发以处理时间限制,所有CRUD(创建、读取、更新和删除)操作都返回一个布尔值,表示该操作是否会完成。此布尔值可用于结束执行的信号和实现基于延续的模型以恢复执行(这在我们下面的代码示例中说明)。更多详细信息,请参阅文档。

上面提供的批量插入存储过程通过返回成功创建的文档数量来实现延续模型。

伪码:

function createDocsFromCSV(csv_text,count) {
    function parse(txt) { // ... parsing code here ... }

    var collection = getContext().getCollection();
    var response = getContext().getResponse();

    var docs_to_create = parse(csv_text);
    for(var ii=count; ii<docs_to_create.length; ii++) {
        var accepted = collection.createDocument(collection.getSelfLink(),
                                                    docs_to_create[ii],
                                                    function(err, doc_created) {
                                                        if(err) throw new Error('Error' + err.message);
                                                    });
        if(!accepted) {
            getContext().getResponse().setBody(count);
        }
    }
}

然后,您可以检查客户端的输出文档计数,并使用count参数重新运行存储过程,以创建剩余的文档集,直到计数大于csv_text的长度。

希望对你有帮助。

 类似资料:
  • 本文向大家介绍如何执行批量插入?相关面试题,主要包含被问及如何执行批量插入?时的应答技巧和注意事项,需要的朋友参考一下 首先,创建一个简单的 insert 语句:   然后在 java 代码中像下面这样执行批处理插入:

  • 问题内容: 使用hibernate时,当我尝试使用以下方式启用批量插入时 我得到以下输出: 然后这个: 基本上没有。 我是否缺少设置? 问题答案: 原来在这种情况下缺少的是: 现在我明白了 频繁得多(任何大于1的值基本上都意味着它成功完成了批量插入)。 hibernate.jdbc.batch_versioned_data也可能有用。 jdbc:mysql:// localhost:3306 /

  • 问题内容: 我有许多记录需要输入到表中。在查询中执行此操作的最佳方法是什么?我是否应该进行循环并在每次迭代中插入一条记录?或者,还有更好的方法? 问题答案: 从MySQL手册 使用VALUES语法的INSERT语句可以插入多行。为此,请包括多个列值列表,每个列值括在括号内并用逗号分隔。例:

  • 问题内容: 在MS SQL上,我可以使用以下sql命令进行批量插入: 现在我想在MySQL上做同样的事情,但是我似乎无法弄清楚它是如何工作的以及使用什么查询。 问题答案: 在MySQL中,等效项为 加载数据文件 http://dev.mysql.com/doc/refman/5.1/en/load- data.html

  • 我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出

  • 问题内容: 使用休眠时,当我尝试使用以下方式启用批量插入时 我得到以下输出: 然后这个: 基本上没有。 我是否缺少设置? 问题答案: 原来这种情况下缺少的是: 参考:https : //forum.hibernate.org/viewtopic.php ? p =2374413,https : //stackoverflow.com/a/5240930/32453 或可能是hibernate.or