我想上传一个代表10k文档的CSV文件,以快速和原子的方式添加到我的Cosmos DB集合中。我有一个存储过程,如下面的伪代码:
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)后,我没有看到像创建文档那样获取延续令牌的方法,就像我查询文档一样。
有没有办法利用存储过程来创建批量文档?
答案 0 :(得分:2)
重要的是要注意存储过程具有有限执行,其中所有操作必须在服务器指定的请求超时持续时间内完成。如果操作未完成该时间限制,则会自动回滚事务。
为了简化开发以处理时间限制,所有CRUD(创建,读取,更新和删除)操作都返回一个布尔值,表示该操作是否完成。此布尔值可用于包装执行和实现基于延续的模型以恢复执行的信号(这在下面的代码示例中说明)。更多详情,请参阅doc。
上面提供的批量插入存储过程通过返回成功创建的文档数来实现延续模型。
<强> 伪码: 强>
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
的长度为止
希望它对你有所帮助。