2017-02-14 7 views
0

特定のフィールド値(documentType = 'Virtual')を持つDocumentDBコレクションのドキュメントを削除しようとしています。私は以前にクエリドキュメントの呼び出しを行って、一致するドキュメントの配列を取得しています。しかし、私が.deleteDocument関数を呼び出すと、何も起こりません!エラーはなく、デバッガで実行されていることがわかるコールバックコードは入力されません。 私はVS Community 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

注意は、あなたがdelCntにconsole.logが、あなたは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、コメントありがとう、私は非同期ライブラリを見ていきます。ループに関してあなたに同意してください。私がdocumentDBで抱えている最大の問題の1つであるTBHは、nodeJSの優れたドキュメントと例がないため、MongoDBが手放しであり、APIの使用がはるかに簡単であると言わざるを得ません。確かに、コレクション内のドキュメントを削除することは、ドキュメント指向のデータベースでは難しくありませんか?ゲーリーに感謝します。 –

+0

両方を広範囲に使用したことで、これら2組のドキュメントの成熟度に違いがあることに同意します。私がDocumentDBドキュメントについて最も気に入っているのは、それらがすべてGitHubプロジェクトであるということです。私の最初のDocumentDBへの提出は、それらのドキュメントの編集でした。 私の提案に基づいて動作させることができれば、答えを受け入れることができますか? –

+0

私は非同期を使用し、ストリーム処理を介して動作するようにしました。完了するのは簡単ではありませんが、一度学んだら、忘れてはいけません! –