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