我有一个简单的代码,试图在MongoDB集合中查找文档。我通常可以通过Mongo的shell客户端找到它,但是通过Node是不可能的,我尝试了很多方法无济于事。节点 - MongoDB:集合使用mongodb驱动程序找不到任何东西。壳没有返回值
首先我从结果本身的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查询作品。现在,这是我的节点代码:
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方法实际上从来没有被执行,或类似的东西。
我的问题是,我做错了什么?我已经停止并重新创建集合,删除了数据库,甚至为Mongo更改了我的/ data/db目录,但无济于事。
我在做什么错?
谢谢!
[已解决]更新: 问题在于db.close()。节点是异步的,在到达集合的查找之前到达了数据库的结尾,所以当然无法找到一个东西。只需在最后一次回调中移动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 ********************/
});
顺便说一句,如果你找到答案,你自己的问题,或者即使你张贴问题之前就知道它,你可以将它张贴作为一个答案,而不是作为一个编辑。 http://meta.stackexchange.com/a/17467/ – 2013-03-22 23:15:17