2013-12-20 18 views
13

Ich bin völlig neu in mongoDB und habe keine Erfahrung mit Node.js, also bitte entschuldigen Sie, wenn der folgende Code nicht perfekt ist.Entfernen von Dokumenten aus einer Mongodb-Sammlung von node.js

Das Ziel besteht darin, ein Dokument aus einer Sammlung zu entfernen, die von seiner _id referenziert wird. Das Entfernen ist abgeschlossen (checked in mongo shell), aber der Code endet nicht (node myscript.js läuft nicht meine Shell zurück). Wenn ich eine db.close() hinzufüge, bekomme ich { [MongoError: Connection Closed By Application] name: 'MongoError' }.

var MongoClient = require("mongodb").MongoClient; 
var ObjectID = require("mongodb").ObjectID; 

MongoClient.connect('mongodb://localhost/mochatests', function(err, db) { 
    if (err) { 
     console.log("error connecting"); 
     throw err; 
    } 
    db.collection('contacts', {}, function(err, contacts) { 
     if (err) { 
      console.log("error getting collection"); 
      throw err; 
     } 
     contacts.remove({_id: ObjectID("52b2f757b8116e1df2eb46ac")}, {safe: true}, function(err, result) { 
      if (err) { 
       console.log(err); 
       throw err; 
      } 
      console.log(result); 
     }); 
    }); 
    db.close(); 
}); 

Muss ich die Verbindung nicht schließen? Was passiert, wenn ich es nicht schließe und das Programm nicht endet?

Danke!

+2

Nichts geschieht, wird Ihr Programm wartet nur für einige I/O von Mongo-Treiber. Natürlich wissen Sie, dass nichts ankommen wird und Sie nichts senden werden, aber Node weiß das nicht und kann es nicht beenden. – kamituel

Antwort

18

Willkommen bei asynchronem Stil:

  • Sie sollten nicht Wurf für Rückruf verwenden, ist throw gut für die Funktion Stapel
  • db.close() in dem Callback sein sollte, nach dem Entfernen erfolgt.

Beispiel:

MongoClient.connect('mongodb://localhost/mochatests', function(err, db) { 
    db.collection('contacts', {}, function(err, contacts) { 
     contacts.remove({_id: ObjectID("52b2f757b8116e1df2eb46ac")}, function(err, result) { 
      if (err) { 
       console.log(err); 
      } 
      console.log(result); 
      db.close(); 
     }); 
    }); 
}); 
+0

Das hat gut funktioniert, danke :) – marc0s

+0

Es funktioniert, aber ich würde gerne verstehen, warum Sie schließen müssen, so dass die Entfernung tatsächlich passiert ... – Jeep87c

Verwandte Themen