2011-04-26 8 views
88

मेरे पास डेटाबेस test डेटाबेस में 300 question ऑब्जेक्ट्स का एक बड़ा संग्रह है। मैं मोंगोडीबी के इंटरैक्टिव शैल के माध्यम से आसानी से इस संग्रह के साथ बातचीत कर सकता हूं; हालांकि, जब मैं एक व्यक्त.जेएस अनुप्रयोग में मोंगोस के माध्यम से संग्रह प्राप्त करने का प्रयास करता हूं तो मुझे एक खाली सरणी मिलती है।मोंगोस के साथ एक पूर्ववर्ती संग्रह का उपयोग कैसे करें?

मेरा सवाल यह है कि, मैं इसे पहले से मौजूद डेटासेट को एक्सप्रेस में पुन: प्रयास करने के बजाय कैसे एक्सेस कर सकता हूं?

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost/test'); 
mongoose.model('question', new Schema({ url: String, text: String, id: Number })); 

var questions = mongoose.model('question'); 
questions.find({}, function(err, data) { console.log(err, data, data.length); }); 

यह आउटपुट:

null [] 0 

उत्तर

181

नेवला संग्रह निर्दिष्ट करने की क्षमता जोड़ा स्कीमा के तहत नाम, या मॉडल घोषित करते समय तीसरे तर्क के रूप में। अन्यथा यह मॉडल द्वारा मानचित्र के नाम से दिए गए बहुवचन संस्करण का उपयोग करेगा।

निम्नलिखित की तरह कुछ स्कीमा नक्शे का प्रयास करें, या तो:

new Schema({ url: String, text: String, id: Number}, 
      { collection : 'question' }); // collection name 

या मॉडल मैप किया: और

mongoose.model('Question', 
       new Schema({ url: String, text: String, id: Number}), 
       'question');  // collection name 
+5

के रूप में चिह्नित किया जाना चाहिए दस्तावेज़ों में मुझे यह जानकारी कहां मिल सकती है? यह वास्तव में मदद की लेकिन बहुवचन चीज समझा कोई जगह नहीं है। – StudioWorks

+0

हाय, @calvinfo मैं रनटाइम पर संग्रह नाम कैसे बदल सकता हूं? मेरे पास UserSchema के 5 संग्रह हैं और मैं प्रत्येक को एक अलग नाम देना चाहता हूं जैसे: user_server1, users_server2, users_server3 ... – Ragnar

+1

Pleae उदाहरण क्वेरी प्रदान करें, उदा। 'Model.collection.insert(); ..' – nottinhill

5

क्या आप वाकई db से कनेक्ट हो जाते हैं यहाँ कुछ कोड है? (मैं पूछता हूँ क्योंकि मैं एक बंदरगाह निर्दिष्ट नहीं दिख रहा है)

कोशिश:

mongoose.connection.on("open", function(){ 
    console.log("mongodb is connected!!"); 
}); 

इसके अलावा, आप एक "शो संग्रह" मोंगो खोल में अपने डाटाबेस के भीतर संग्रह देखने के लिए क्या कर सकते हैं - हो सकता है जोड़ने का प्रयास करें मोंगोज़ के माध्यम से एक रिकॉर्ड और देखें कि यह कहां समाप्त होता है?

अपनी कनेक्शन स्ट्रिंग के रूप में, आपको "परीक्षण" डीबी में रिकॉर्ड देखना चाहिए।

उम्मीद है कि यह मदद करता है!

+3

दिलचस्प, यह वास्तव में एक 'questions' संग्रह में जानकारी संग्रहीत है जब डेटा मैं कोशिश कर रहा हूँ पहुंच के लिए 'प्रश्न' संग्रह में है। क्या मोंगोस स्वचालित रूप से संग्रह/मॉडल नामों को बहुवचन करता है? – theabraham

+0

हाँ मुझे लगता है कि यह करता है ... हे! मैं बस खुद को शुरू कर रहा हूं इसलिए मैंने सभी नुक्कड़ और क्रैनियों की खोज नहीं की है ... लेकिन मुझे लगता है कि जब मैं Google समूह के माध्यम से कताई कर रहा था तब तक मुझे उस चेतना की हवा को देखकर याद आया। – busticated

12

मुझे एक ही समस्या थी और नीचे दिए गए कोड के साथ मौजूदा मोंगोस कनेक्शन का उपयोग करके स्कीमा-कम क्वेरी चलाने में सक्षम था।

var action = function (err, collection) { 
    // Locate all the entries using find 
    collection.find({'a':'b'}).toArray(function(err, results) { 
     /* whatever you want to do with the results in node such as the following 
      res.render('home', { 
       'title': 'MyTitle', 
       'data': results 
      }); 
     */ 
    }); 
}; 

mongoose.connection.db.collection('question', action); 
+1

यह वही है जो मैं खोज रहा था क्योंकि मोंगोस में कोई ग्रिडएफएस समर्थन नहीं है। मैं gridfs (ग्रिडस्टोर) से फ़ाइल मेटाडेटा को पकड़ने के लिए इस विधि का उपयोग करता हूं। उपरोक्त कोड में 'fs.files' के साथ बस 'प्रश्न' को प्रतिस्थापित करें और आप जाने के लिए अच्छे हैं। – k00k

41

यहाँ विल नाथन के जवाब अगर कोई बस एक आसान कॉपी-पेस्ट ऐड-इन समारोह चाहता है के एक अमूर्त है: मैं एक साधारण बाधा 'a = b' दिखाने के लिए जहां इस तरह के एक बाधा जोड़ना होगा जोड़ दिया है:

function find (collec, query, callback) { 
    mongoose.connection.db.collection(collec, function (err, collection) { 
    collection.find(query).toArray(callback); 
    }); 
} 

परिणाम देने के लिए बस find(collection_name, query, callback); करें।

उदाहरण के लिए

, अगर मैं एक दस्तावेज है जो {a: 1} एक संग्रह 'foo' में है और मैं उसके गुण सूचीबद्ध करना चाहते हैं, मैं यह कर:

find('foo', {a : 1}, function (err, docs) { 
      console.dir(docs); 
     }); 
//output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ] 
+0

एपीआई – Greg

+0

पर एकीकरण परीक्षण चलाने पर यह बहुत उपयोगी है यह सही एवर है। –

+0

हाय, क्या यह एक परमाणु ऑपरेशन है? मान लीजिए कि मैं दस्तावेज़ को कॉलबैक फ़ंक्शन में सहेजने का प्रयास करता हूं। क्या यह परमाणु होगा? –

1

कुछ स्पष्ट नहीं था, मेरे लिए कम से कम, कि जब का उपयोग कर रहा था एक ही नाम के साथ वास्तविक संग्रह को बदलने के लिए मोंगोस का तीसरा पैरामीटर, new Schema(...) वास्तव में केवल प्लेसहोल्डर है, और एक्सिसिटिंग स्कीमा में हस्तक्षेप नहीं करता है, इसलिए

var User = mongoose.model('User', new Schema({ url: String, text: String, id: Number}, { collection : 'users' })); // collection name; 
User.find({}, function(err, data) { console.log(err, data, data.length);}); 

ठीक काम करता है और सभी फ़ील्ड लौटाता है - भले ही वास्तविक (दूरस्थ) स्कीमा में इनमें से कोई भी फ़ील्ड न हो। Mongoose अभी भी इसे new Schema(...) के रूप में चाहेगा, और एक चर लगभग निश्चित रूप से इसे हैक नहीं करेगा।

+1

यह मेरे लिए देता है 'संग्रह नाम स्ट्रिंग होनी चाहिए' त्रुटि, संपादित करें: 'कैल्विनफ़ोर्न के उत्तर के रूप में, यदि आप मॉडल कन्स्ट्रक्टर में संग्रह नाम देना चाहते हैं तो आप केवल स्ट्रिंग फॉर्म में संग्रहण नाम को ऑब्जेक्ट मॉडल नहीं देते हैं। तो आपका उत्तर सही होगा अगर इस तरह संपादित करें, var उपयोगकर्ता = mongoose.model ('उपयोगकर्ता', नई स्कीमा ({url: स्ट्रिंग, टेक्स्ट: स्ट्रिंग, आईडी: संख्या}, 'उपयोगकर्ता'); // संग्रह का नाम; User.find ({}, फ़ंक्शन (त्रुटि, डेटा) {console.log (त्रुटि, डेटा, डेटा। लम्बाई);}); –

10

आप कुछ इस तरह कर सकते हैं, आप की तुलना में आप नेवला अंदर देशी MongoDB फ़ंक्शन तक पहुंच होगी:

var mongoose = require("mongoose"); 
mongoose.connect('mongodb://localhost/local'); 

var connection = mongoose.connection; 

connection.on('error', console.error.bind(console, 'connection error:')); 
connection.once('open', function() { 

    connection.db.collection("YourCollectionName", function(err, collection){ 
     collection.find({}).toArray(function(err, data){ 
      console.log(data); // it will print your collection data 
     }) 
    }); 

}); 
+0

अच्छा !! ठीक वही जो मेरे द्वारा खोजा जा रहा था –