2013-03-22 1 views
5

У меня есть простой код, пытающийся найти документ в коллекции 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 ********************/ 
     }); 
+6

Btw, если вы найдете ответ на свой вопрос, или даже если вы знали его, прежде чем отправлять на этот вопрос, вы можете оставить его в качестве ответа, а не как редактировать. http://meta.stackexchange.com/a/17467/ –

ответ

0

Проблема с db.close(). Узел начинается асинхронно и доходит до конца 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'); 
          } 
/********** 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 ********************/ 
    });