2017-02-14 39 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

經過一段時間的擺弄之後,我使用了異步並通過流處理讓它工作。不是一件容易完成的任務,但一旦學會,不會忘記! –