2013-03-22 6 views
5

मेरे पास एक मोंगोडीबी संग्रह में एक दस्तावेज़ खोजने का प्रयास करने वाला एक सरल कोड है। मैं इसे आम तौर पर मोंगो के शैल क्लाइंट के साथ पा सकता हूं, लेकिन नोड के माध्यम से असंभव है, मैंने इसका कोई फायदा नहीं उठाया है।नोड - 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 विधि वास्तव में कभी निष्पादित नहीं होता है, या ऐसा कुछ नहीं।

मेरा सवाल है, मैं क्या गलत कर रहा हूं? मैंने संग्रह को छोड़ दिया है और फिर से बनाया है, डेटाबेस गिरा दिया है और यहां तक ​​कि मैंने मोंगो के लिए अपनी/डेटा/डीबी निर्देशिका भी बदल दी है, इसका कोई फायदा नहीं हुआ है।

मैं क्या गलत कर रहा हूं?

धन्यवाद!

[सॉल्व] अद्यतन: समस्या 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 ********************/ 
     }); 
+6

Btw: यहाँ संपादित कोड है। http://meta.stackexchange.com/a/17467/ –

उत्तर

0

समस्या 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'); 
          } 
/********** 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 ********************/ 
    }); 
संबंधित मुद्दे