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