[解決済み] NodejsでMongoDBデータベース接続を終了するとき
質問
NodejsとNode MongoDBネイティブドライバを介してMongoDBで作業しています。いくつかのドキュメントを取得し、変更を加え、それらをすぐに戻って保存する必要があります。これは例です。
db.open(function (err, db) {
db.collection('foo', function (err, collection) {
var cursor = collection.find({});
cursor.each(function (err, doc) {
if (doc != null) {
doc.newkey = 'foo'; // Make some changes
db.save(doc); // Update the document
} else {
db.close(); // Closing the connection
}
});
});
});
非同期のため、文書の更新処理に時間がかかる場合、カーソルが文書の末尾に達すると、データベース接続が切断されます。すべての更新がデータベースに保存されるわけではありません。
もし
db.close()
が省略された場合、すべてのドキュメントは正しく更新されますが、アプリケーションはハングアップし、終了することはありません。
私は、更新の数を追跡するためにカウンターを使用することを提案するポストを見ました、ゼロにフォールバックしたとき、それからデータベースを閉じます。しかし、私はここで何か間違ったことをしているのでしょうか? このような状況を処理する最良の方法は何でしょうか? 次のようになります。
db.close()
はリソースを解放するために使用されなければならないのでしょうか?それとも、新しいデータベース接続を開く必要があるのでしょうか?
どのように解決するのですか?
カウント方式に基づく解決策を紹介します(テストはしていませんし、エラートラップもありませんが、アイデアは伝わるはずです)。
基本的な戦略は次のとおりです。更新が必要なレコード数のカウントを取得し、各レコードを非同期に保存し、成功時にコールバックでカウントをデクリメントし、カウントが 0 に達した場合 (最後の更新が終了したとき) に DB を閉じます。を使うことで
{safe:true}
を使用することで、各更新が成功することを保証できます。
mongoサーバーは1つの接続につき1つのスレッドを使用するので、a) 未使用の接続を閉じるか、b) 接続をプールして再利用するのがよいでしょう。
db.open(function (err, db) {
db.collection('foo', function (err, collection) {
var cursor = collection.find({});
cursor.count(function(err,count)){
var savesPending = count;
if(count == 0){
db.close();
return;
}
var saveFinished = function(){
savesPending--;
if(savesPending == 0){
db.close();
}
}
cursor.each(function (err, doc) {
if (doc != null) {
doc.newkey = 'foo'; // Make some changes
db.save(doc, {safe:true}, saveFinished);
}
});
})
});
});
関連
-
[解決済み】MongoDBデータベースの名前を変更する方法とは?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] コマンドラインからMongoDBデータベースを削除する方法を教えてください。
-
[解決済み] MongoDB データベースのすべてを削除する
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] JSHintの'+'前の改行不良の説明
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)