2013-03-22 9 views
5

Ich habe einen einfachen Code, der versucht, ein Dokument in einer MongoDB-Sammlung zu finden. Ich kann es normalerweise mit dem Shell-Client von Mongo finden, aber durch Node ist es unmöglich, ich habe viele Möglichkeiten ausprobiert, um nichts zu tun.Knoten - MongoDB: Sammlung finde nichts, mit mongodb Treiber. Shell gibt den Wert zurück

Zuerst meine Ergebnisse von MongoDB selbst:

[email protected]:~$ mongo sdk_back 
MongoDB shell version: 2.0.6 
connecting to: sdk_back 
> db.metadatos.find(); 
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } 
> db.metadatos.findOne({"tipo":"proceso"}); 
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } 
> db.metadatos.findOne({tipo:"proceso"}); 
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } 
> 

Wie Sie sehen können, beide finden und FindOne abfragt funktioniert. Nun ist dies mein Knoten Code:

var utils = require('../utils/utils.js'), 
    Server = require('mongodb').Server, 
    Db = require('mongodb').Db; 

    exports.procesaJSON = function (input_json){ 
    if(!utils.validaJSON(input_json)) 
     throw new Error('JSON de entrada inválido!'); 

    //procesamos 
    input_json = JSON.parse(input_json); 

    if(typeof(input_json.id) === "undefined") 
     throw new Error('JSON de entrada inválido (falta propiedad \"id\"!'); 

    //obtenemos meta-data de mongo 
    var db = new Db("sdk_back", new Server('localhost',27017,{auto_reconnect:true, poolsize:1}),{safe:true}); 
    db.open(function(err,db){ 
     if(!err){ 
      db.collection("metadatos",function(err,collection){ 
       console.log('Entering collection meta-data'); 
       if(!err){ 
        console.log('Lets find one'); 
        collection.findOne({"tipo":"proceso"},function(err,doc){ 
         console.log('Results of findOne'); 
         if(!err){ 
          console.log(doc); 
         } 
         else{ 
          throw new Error('Error al buscar meta_data!'); 
         } 

         if(doc){ 
          console.log('We have results'); 
         } 
         else{ 
          console.log('We dont have results'); 
         } 
        }); 
       } 
       else{ 
        throw new Error('Error al buscar meta_data 1!'); 
       } 
      }); 
     } 
     else{ 
      throw new Error('Error al conectarse a MongoDB!'); 
     } 
     db.close(); 
    }); 
}; 

Und der Ausgang ist immer:

[email protected]:~$ node pu_entrypoint.js 
Entering collection meta-data 
Lets find one 
[email protected]:~$ 

Wie Sie sehen können, das Protokoll mit dem Text „Die Ergebnisse der FindOne“ wird nie angezeigt, so dass die FindOne Methode wird nie ausgeführt oder so ähnlich.

Meine Frage ist, was mache ich falsch? Ich habe die Sammlung gelöscht und neu erstellt, die Datenbank gelöscht und sogar mein/data/db-Verzeichnis für Mongo geändert, ohne Erfolg.

Was mache ich falsch?

Vielen Dank!

[Gelöst] UPDATE: Das Problem war mit db.close(). Knoten asynchron, erreichte den Abschluss der db vor dem Fund der Sammlungen, so natürlich konnte nichts finden. Durch einfaches Verschieben von db.close in meinem letzten Rückruf wurde das Problem behoben. Hier ist der bearbeitete Code:

db.open(function(err,db){ 
      if(!err){ 
       db.collection("metadatos",function(err,collection){ 
        console.log('Entering collection meta-data'); 
        if(!err){ 
         console.log('Lets find one'); 
         collection.findOne({"tipo":"proceso"},function(err,doc){ 
          console.log('Results of findOne'); 
          if(!err){ 
           if(doc){ 
            console.log('We have results'); 
            console.log(doc._id); 
           } 
           else{ 
            console.log('We dont have results'); 
           } 
/********** MOVED db.close() HERE ********************/ 
           db.close(); 
          } 
          else{ 
           throw new Error('Error al buscar meta_data!'); 
          } 
         }); 
        } 
        else{ 
         throw new Error('Error al buscar meta_data 1!'); 
        } 
       }); 
      } 
      else{ 
       throw new Error('Error al conectarse a MongoDB!'); 
      } 
/********** REMOVED db.close() FROM HERE ********************/ 
     }); 
+6

Btw, wenn Sie die Antwort auf Ihre eigene Frage zu finden, oder auch wenn Sie es wussten, bevor die Frage veröffentlichen, können Sie es als eine Antwort schreiben und nicht als bearbeiten. http://meta.stackexchange.com/a/17467/ –

Antwort

0

Das Problem ist mit db.close(). Der Knoten beginnt asynchron und erreicht den Abschluss der db, bevor er den Fund der Sammlungen erreicht, also natürlich nichts finden konnte. Das Verschieben von db.close innerhalb des letzten Callbacks löst das Problem. Hier ist der bearbeitete Code:

db.open(function(err,db){ 
     if(!err){ 
      db.collection("metadatos",function(err,collection){ 
       console.log('Entering collection meta-data'); 
       if(!err){ 
        console.log('Lets find one'); 
        collection.findOne({"tipo":"proceso"},function(err,doc){ 
         console.log('Results of findOne'); 
         if(!err){ 
          if(doc){ 
           console.log('We have results'); 
           console.log(doc._id); 
          } 
          else{ 
           console.log('We dont have results'); 
          } 
/********** MOVE db.close() HERE ********************/ 
          db.close(); 
         } 
         else{ 
          throw new Error('Error al buscar meta_data!'); 
         } 
        }); 
       } 
       else{ 
        throw new Error('Error al buscar meta_data 1!'); 
       } 
      }); 
     } 
     else{ 
      throw new Error('Error al conectarse a MongoDB!'); 
     } 
/********** REMOVED db.close() FROM HERE ********************/ 
    }); 
Verwandte Themen