У меня есть простой код, пытающийся найти документ в коллекции MongoDB. Я могу найти его обычно с клиентом оболочки Mongo, но через Node невозможно, я пробовал много способов безрезультатно.Узел - MongoDB: коллекция ничего не находит, используя драйвер mongodb. Shell возвращает значение
Первые мои результаты от самого MongoDB:
[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" }
>
Как вы можете видеть, как найти и findOne запросов работает. Теперь это мой код 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();
});
};
А выход всегда:
[email protected]:~$ node pu_entrypoint.js
Entering collection meta-data
Lets find one
[email protected]:~$
Как вы можете видеть, журнал с текстом «Итоги findOne» никогда не отображается, поэтому метод findOne на самом деле никогда не исполняются, или что-то в этом роде.
Мой вопрос: что я делаю неправильно? Я бросил и воссоздал коллекцию, сбросил базу данных и даже изменил каталог/data/db для Mongo, но безрезультатно.
Что я делаю неправильно?
Спасибо!
[SOLVED] UPDATE: Проблема была в db.close(). Узел beign асинхронный, дошел до конца db до достижения находки коллекций, так что конечно не смог найти ничего. Просто переместив db.close внутри моего последнего обратного вызова, решила проблему. Вот отредактированный код:
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, если вы найдете ответ на свой вопрос, или даже если вы знали его, прежде чем отправлять на этот вопрос, вы можете оставить его в качестве ответа, а не как редактировать. http://meta.stackexchange.com/a/17467/ –