2013-03-22 15 views
5

Ho un semplice codice che cerca di trovare un documento in una raccolta MongoDB. Posso trovarlo normalmente con il client di shell di Mongo, ma tramite Node è impossibile, ho provato molti modi inutilmente.Node - MongoDB: collezione non trova nulla, usando il driver mongodb. Shell restituisce il valore

primi i miei risultati da MongoDB stesso:

[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" } 
> 

Come si può vedere, sia trovare e findOne interroga opere. Ora, questo è il mio codice Node:

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(); 
    }); 
}; 

e l'uscita è sempre:

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

Come si può vedere, il registro con il testo "I risultati di findOne" non viene mai visualizzato, quindi il metodo findOne in realtà non viene mai eseguito, o qualcosa del genere.

La mia domanda è, cosa sto sbagliando? Ho abbandonato e ricreato la raccolta, ho abbandonato il database e anche ho cambiato la mia directory/data/db per Mongo, senza alcun risultato.

Cosa sto sbagliando?

Grazie!

[Risolto] UPDATE: il problema era con db.Close(). Node beign asincrono, ha raggiunto la chiusura del db prima di raggiungere la ricerca delle collezioni, quindi non è stato possibile trovare una cosa. Basta spostare db.close nella mia ultima callback, risolto il problema. Ecco il codice modificato:

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, se si trova la risposta alla tua stessa domanda, o anche se si sapeva che prima di pubblicare la domanda, è possibile pubblicarlo come una risposta piuttosto che come una modifica. http://meta.stackexchange.com/a/17467/ –

risposta

0

Il problema è con db.Close(). Il nodo inizia in modo asincrono e raggiunge la fine del db prima di raggiungere la ricerca delle raccolte, quindi non è stato possibile trovare una cosa. Spostando db.close nell'ultimo callback, risolve il problema. Ecco il codice modificato:

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 ********************/ 
    }); 
Problemi correlati