是否可以选择特定索引的文档?
我有一个文档导入过程,我从我的数据源获取一个项目页面(一次250个项目)然后我将这些项目同时导入到DocumentDB中。假设我在将这些项插入DocumentDB时出错,我不确定哪些项目或项目失败。 (我可以解决它,但不想)。再次从页面中突出显示所有项目会更容易。
我插入的项目具有升序ID。因此,如果我查询DocumentDB(按id排序)并选择位置的id(所有Id' s的页数),我可以再次从该点开始导入。
我知道SKIP没有实现,我想检查是否还有其他选项?
答案 0 :(得分:0)
您可以尝试批量导入存储过程。下面的sproc创建代码来自Azure's github repo。如果sproc超时,此sproc将报告批处理中创建的文档数并继续尝试创建多个文档。
由于sproc是ACID,如果抛出任何异常,则必须从头开始(或最后一个成功批处理)重试。 如果您只想在抛出任何异常时重试整个批处理过程,也可以将createDocument函数更改为upsertDocument。
{
id: "bulkImportSproc",
body: function bulkImport(docs) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
// The count of imported docs, also used as current doc index.
var count = 0;
// Validate input.
if (!docs) throw new Error("The array is undefined or null.");
var docsLength = docs.length;
if (docsLength == 0) {
getContext().getResponse().setBody(0);
return;
}
// Call the CRUD API to create a document.
tryCreate(docs[count], callback);
// Note that there are 2 exit conditions:
// 1) The createDocument request was not accepted.
// In this case the callback will not be called, we just call setBody and we are done.
// 2) The callback was called docs.length times.
// In this case all documents were created and we don't need to call tryCreate anymore. Just call setBody and we are done.
function tryCreate(doc, callback) {
var isAccepted = collection.createDocument(collectionLink, doc, callback);
// If the request was accepted, callback will be called.
// Otherwise report current count back to the client,
// which will call the script again with remaining set of docs.
// This condition will happen when this stored procedure has been running too long
// and is about to get cancelled by the server. This will allow the calling client
// to resume this batch from the point we got to before isAccepted was set to false
if (!isAccepted) getContext().getResponse().setBody(count);
}
// This is called when collection.createDocument is done and the document has been persisted.
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.
tryCreate(docs[count], callback);
}
}
}
}