Nodejs DocumentDB - deleteDocument

时间:2017-02-14 09:48:33

标签: node.js azure-cosmosdb

我试图删除具有特定字段值的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)");

由于

加里

1 个答案:

答案 0 :(得分:0)

注意,你是console.log delCnt但是你正在递增delCount。也就是说,我不认为这是最大的问题。

在JavaScript中,你不应该将异步操作调用到循环中,因为在第一个有机会返回之前,它只会进行大量调用并溢出一些资源(可能是打开的连接)。

相反,您需要以有助于JavaScript异步性质的方式处理它。两个选项:

  1. <强>递归即可。这样的事情(未经测试)。

    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)");
                }
            }
        }
    }
    
  2. 使用异步并行化库。上面的缺点是你没有获得任何并行化意味着删除下一个文档的新调用将在最后一个文档完成之前发生。为了解决这个问题,我建议使用像async.js这样的库。我建议eachOfLimit()函数满足此需求。您必须尝试并行化限制,但从10开始并从那里开始,直到您获得所需的并行化或达到某个资源限制。如果您决定采用这种方式,我可以写出使用async.js的代码,只需在评论中提问。