Nodejs 文档数据库 - 删除文档
Nodejs DocumentDB - deleteDocument
我正在尝试删除 DocumentDB 集合中具有特定字段值 (documentType='Virtual') 的文档。我之前正在进行查询文档调用以获取找到匹配的文档数组,这很好。但是当我调用 .deleteDocument 函数时......没有任何反应!没有错误,它没有输入我可以在调试器中看到 运行 的回调代码。
我正在使用 VS Community 2015。
我已在线查看文档和 Azure 示例,但无法找出问题所在,因此已在此处发布。
有什么想法吗?
console.log("Found " + results.length + " document(s) to delete");
for (r in results )
{
var docId = results[r].id;
docLink = 'dbs/' + databaseId + '/colls/' + collectionId + '/docs/' + docId;
console.log(results[r]);
client.deleteDocument(docLink , function (err)
{
if (err)
{
handleError(err);
}
else
{
console.log('Document deleted');
delCount++;
}
});
}
console.log("Deleted " + delCnt + " document(s)");
谢谢
加里
请注意,您 console.log delCnt
但您正在递增 delCount
。也就是说,我认为这不是最大的问题。
在 JavaScript 中,您不应该将对异步操作的调用放入循环中,因为它只会进行大量调用并在第一个调用获得之前溢出一些资源(可能是打开的连接)有机会 return.
相反,您需要以有利于 JavaScript 的异步特性的方式处理它。两个选项:
递归。像这样(未经测试)。
console.log("Found " + results.length + " document(s) to delete");
delCount = 0;
deleteDoc();
function deleteDoc()
{
var doc = results.pop();
var docId = doc.id;
docLink = 'dbs/' + databaseId + '/colls/' + collectionId + '/docs/' + docId;
client.deleteDocument(docLink , function (err)
{
if (err)
{
handleError(err);
}
else
{
console.log('Document deleted');
delCount++;
if (results.length > 0)
{
deleteDoc();
}
else
{
console.log("Deleted " + delCount + " document(s)");
}
}
}
}
使用异步并行化库。上面的缺点是你不会得到任何并行化,这意味着在最后一个文档完成之前不会发生删除下一个文档的新调用。为了解决这个问题,我建议使用像 async.js. I recommend the eachOfLimit() 函数这样的库来满足这种需要。您必须尝试并行化限制,但从 10 开始并从那里开始,直到您获得所需的并行化或达到某个资源限制。如果您决定这样做,我可以写出使用 async.js 的代码,请在评论中提问。
我正在尝试删除 DocumentDB 集合中具有特定字段值 (documentType='Virtual') 的文档。我之前正在进行查询文档调用以获取找到匹配的文档数组,这很好。但是当我调用 .deleteDocument 函数时......没有任何反应!没有错误,它没有输入我可以在调试器中看到 运行 的回调代码。 我正在使用 VS Community 2015。
我已在线查看文档和 Azure 示例,但无法找出问题所在,因此已在此处发布。
有什么想法吗?
console.log("Found " + results.length + " document(s) to delete");
for (r in results )
{
var docId = results[r].id;
docLink = 'dbs/' + databaseId + '/colls/' + collectionId + '/docs/' + docId;
console.log(results[r]);
client.deleteDocument(docLink , function (err)
{
if (err)
{
handleError(err);
}
else
{
console.log('Document deleted');
delCount++;
}
});
}
console.log("Deleted " + delCnt + " document(s)");
谢谢
加里
请注意,您 console.log delCnt
但您正在递增 delCount
。也就是说,我认为这不是最大的问题。
在 JavaScript 中,您不应该将对异步操作的调用放入循环中,因为它只会进行大量调用并在第一个调用获得之前溢出一些资源(可能是打开的连接)有机会 return.
相反,您需要以有利于 JavaScript 的异步特性的方式处理它。两个选项:
递归。像这样(未经测试)。
console.log("Found " + results.length + " document(s) to delete"); delCount = 0; deleteDoc(); function deleteDoc() { var doc = results.pop(); var docId = doc.id; docLink = 'dbs/' + databaseId + '/colls/' + collectionId + '/docs/' + docId; client.deleteDocument(docLink , function (err) { if (err) { handleError(err); } else { console.log('Document deleted'); delCount++; if (results.length > 0) { deleteDoc(); } else { console.log("Deleted " + delCount + " document(s)"); } } } }
使用异步并行化库。上面的缺点是你不会得到任何并行化,这意味着在最后一个文档完成之前不会发生删除下一个文档的新调用。为了解决这个问题,我建议使用像 async.js. I recommend the eachOfLimit() 函数这样的库来满足这种需要。您必须尝试并行化限制,但从 10 开始并从那里开始,直到您获得所需的并行化或达到某个资源限制。如果您决定这样做,我可以写出使用 async.js 的代码,请在评论中提问。