Mongoose के साथ एक आकर्षक संग्रह तक कैसे पहुँचें?


139

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

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

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

जवाबों:


251

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

निम्नलिखित की तरह कुछ आज़माएं, या तो स्कीमा-मैपेड:

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

9
डॉक्स में मुझे यह जानकारी कहां मिल सकती है? यह वास्तव में असहाय है, लेकिन बहुवचन की व्याख्या करने वाली कोई जगह नहीं है।
स्टूडियोवर्क

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

1
Pleae उदाहरण क्वेरी प्रदान करते हैं, उदाहरण के लिएModel.collection.insert();..
Steve K

6
यहाँ भी, मैं इस मुद्दे का पता लगाने में कई घंटे बिताता हूँ, दस्तावेज़ यहाँ पाया जाता है mongoosejs.com/docs/guide.html#collection
ElvinD

3
इसने मेरे लिए काम किया। मेरे पास एक उपयोगकर्ता संग्रह था जिसे मैंने गलत माना। मैं के साथ यह करने के लिए पहुँच प्राप्त करने के लिएmongoose.connect("mongodb://localhost/fromlab"); var Schema = mongoose.Schema; var User = mongoose.model("User", new Schema({}), "users"); User.find({}, function(err, doc){ console.log((doc)) })
जैक खाली

61

यहां विल नाथन के जवाब का एक सार है यदि कोई भी आसान कॉपी-पेस्ट ऐड-इन फ़ंक्शन चाहता है:

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

बस find(collection_name, query, callback);परिणाम दिया जाना है।

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

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

एक एपीआई पर एकीकरण परीक्षण चलाते समय यह बहुत मददगार होता है
ग्रेग

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

23

आप इस तरह से कुछ कर सकते हैं, आप की तुलना में आप मूल 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
        })
    });

});

1
एकदम सही जवाब!
कैंडलकोडर

15

मेरे पास एक ही समस्या थी और नीचे दिए गए कोड के साथ एक मौजूदा Mongoose कनेक्शन का उपयोग करके स्कीमा-कम क्वेरी को चलाने में सक्षम था। मैंने एक साधारण बाधा 'a = b' को यह दिखाने के लिए जोड़ा है कि आप ऐसी बाधा कहाँ जोड़ेंगे:

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
यह वही है जो मैं देख रहा था क्योंकि मानगो में कोई ग्रिड्स समर्थन नहीं है। मैं ग्रिडफ़स (ग्रिडस्टोर) से फ़ाइल मेटाडेटा को हथियाने के लिए इस पद्धति का उपयोग करता हूं। बस questionऊपर दिए गए कोड में बदलें fs.filesऔर आप जाने के लिए अच्छे हैं।
k00k

7

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

प्रयत्न:

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

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

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

आशा करता हूँ की ये काम करेगा!


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

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

3

कुछ और जो स्पष्ट नहीं था, मेरे लिए कम से कम, यह था कि जब एक ही नाम के साथ एक नए संग्रह के साथ वास्तविक संग्रह को बदलने से बचने के लिए मोंगोज़ के तीसरे पैरामीटर का उपयोग किया 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);});

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


1
यह मेरे लिए 'संग्रह का नाम स्ट्रिंग होना चाहिए' त्रुटि देता है, संपादित करें: 'कैल्विनफो' के उत्तर के रूप में, यदि आप मॉडल निर्माता में संग्रह नाम देना चाहते हैं तो आप स्ट्रिंग नाम नहीं वस्तु मॉडल में संग्रह नाम पास करें। यदि आपका उत्तर इस प्रकार संपादित होता है तो आपका उत्तर सही होगा, var User = mongoose.model ('उपयोगकर्ता', नया स्कीमा ({url: स्ट्रिंग, पाठ: स्ट्रिंग, आईडी: नंबर}, 'उपयोगकर्ता')); // संग्रह नाम; User.find ({}, फ़ंक्शन (इरेट, डेटा) {कंसोल.लॉग (इरेट, डेटा, डेटा .length (}));
कां एरकोक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.