2017-02-14 49 views
0

我试图删除具有特定字段值(documentType ='虚拟')的DocumentDB集合中的文档。我之前正在做一个查询文档调用,以获得匹配的文档数组,并且这个问题很好。但是当我调用.deleteDocument函数时......没有任何反应!没有错误,它不会输入我可以看到在调试器中运行的回调代码。 我正在使用VS社区2015.Nodejs DocumentDB - deleteDocument

我看过两个在线文档和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)"); 

感谢

加里

回答

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的代码,只需在评论中提问即可。

+0

HI Larry,感谢您的评论,我会研究异步库,因为我已经在其他地方看到过。同意你关于循环。 TBH是我在documentDB中遇到的最大问题之一,就是缺乏良好的文档和nodeJS示例,我不得不说,MongoDB在前面,而且它们的API使用起来要简单得多。在面向文档的数据库中,删除集合中的文档当然不应该那么困难!问候加里。 –

+0

经过广泛使用,我同意这两套文档的成熟度存在差异。我最喜欢的DocumentDB文档是他们都是GitHub项目。我首次提交给DocumentDB的内容是对这些文档的编辑。 如果您能够根据我的建议得到它的工作,请您接受答案? –

+0

经过一段时间的摆弄之后,我使用了异步并通过流处理让它工作。不是一件容易完成的任务,但一旦学会,不会忘记! –