MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

नेवला में स्कीमा और मॉडल दोनों क्यों होते हैं?

संपादित करें: यद्यपि यह कई लोगों के लिए उपयोगी रहा है, जैसा कि टिप्पणियों में बताया गया है, यह क्यों के बजाय "कैसे" का उत्तर देता है। शुक्र है कि इस प्रश्न का उत्तर अन्यत्र भी दिया गया है, इस उत्तर के साथ एक अन्य प्रश्न का भी। इसे टिप्पणियों में कुछ समय के लिए जोड़ा गया है लेकिन मुझे एहसास है कि बहुत से लोग पढ़ते समय इतना दूर नहीं हो सकते हैं।

अक्सर इस प्रकार के प्रश्न का उत्तर देने का सबसे आसान तरीका एक उदाहरण है। इस मामले में, किसी ने मेरे लिए इसे पहले ही कर दिया है :)

यहाँ एक नज़र डालें:

http://rawberg.com/blog/nodejs/mongoose-orm-nested-models/

संपादित करें: मूल पोस्ट (जैसा कि टिप्पणियों में बताया गया है) अब मौजूद नहीं है, इसलिए मैं इसे नीचे पुन:प्रस्तुत कर रहा हूं। क्या इसे कभी वापस आना चाहिए, या अगर यह अभी-अभी चला है, तो कृपया मुझे बताएं।

यह नेवले में मॉडल के भीतर स्कीमा का उपयोग करने का एक अच्छा विवरण देता है और आप इसे क्यों करना चाहते हैं, और आपको यह भी दिखाता है कि मॉडल के माध्यम से कार्यों को कैसे आगे बढ़ाया जाए, जबकि स्कीमा संरचना आदि के बारे में है।

मूल पोस्ट:

आइए एक मॉडल के अंदर एक स्कीमा एम्बेड करने के एक सरल उदाहरण से शुरू करें।

var TaskSchema = new Schema({
    name: String,
    priority: Number
});
 
TaskSchema.virtual('nameandpriority')
    .get( function () {
        return this.name + '(' + this.priority + ')';
    });
 
TaskSchema.method('isHighPriority', function() {
    if(this.priority === 1) {
        return true;
    } else {
        return false;
    }
}); 
 
var ListSchema = new Schema({
    name: String,
    tasks: [TaskSchema]
});
 
mongoose.model('List', ListSchema);
 
var List = mongoose.model('List');
 
var sampleList = new List({name:'Sample List'});

मैंने एक नया TaskSchema बनाया है मूल जानकारी के साथ वस्तु एक कार्य हो सकता है। कार्य के नाम और प्राथमिकता को आसानी से संयोजित करने के लिए एक Mongoose वर्चुअल विशेषता सेटअप की गई है। मैंने यहां केवल एक गेटर निर्दिष्ट किया है लेकिन वर्चुअल सेटर्स भी समर्थित हैं।

मैंने isHighPriority . नामक एक सरल कार्य विधि को भी परिभाषित किया है यह दिखाने के लिए कि इस सेटअप के साथ तरीके कैसे काम करते हैं।

ListSchema . में परिभाषा आप देखेंगे कि कैसे tasks key को TaskSchema . की एक सरणी रखने के लिए कॉन्फ़िगर किया गया है वस्तुओं। tasks key DocumentArray का एक उदाहरण बन जाएगा जो एम्बेडेड मोंगो दस्तावेज़ों से निपटने के लिए विशेष तरीके प्रदान करता है।

अभी के लिए मैंने केवल ListSchema . पास किया है mongoose.model . में ऑब्जेक्ट करें और TaskSchema . छोड़ दिया बाहर। तकनीकी रूप से TaskSchema . को चालू करना आवश्यक नहीं है एक औपचारिक मॉडल में क्योंकि हम इसे अपने संग्रह में नहीं सहेजेंगे। बाद में मैं आपको दिखाऊंगा कि अगर आप ऐसा करते हैं तो यह किसी चीज को नुकसान नहीं पहुंचाता है और यह आपके सभी मॉडलों को उसी तरह व्यवस्थित करने में मदद कर सकता है, खासकर जब वे कई फाइलों को फैलाना शुरू करते हैं।

List के साथ मॉडल सेटअप इसमें कुछ कार्य जोड़ते हैं और उन्हें Mongo में सहेजते हैं।

var List = mongoose.model('List');
var sampleList = new List({name:'Sample List'});
 
sampleList.tasks.push(
    {name:'task one', priority:1}, 
    {name:'task two', priority:5}
);
 
sampleList.save(function(err) {
    if (err) {
        console.log('error adding new list');
        console.log(err);
    } else {
        console.log('new list successfully saved'); 
    }
});

हमारे List . के उदाहरण पर कार्य विशेषता मॉडल (sampleList ) एक नियमित जावास्क्रिप्ट सरणी की तरह काम करता है और हम पुश का उपयोग करके इसमें नए कार्य जोड़ सकते हैं। ध्यान देने योग्य महत्वपूर्ण बात है tasks नियमित JavaScript ऑब्जेक्ट के रूप में जोड़े जाते हैं। यह एक सूक्ष्म अंतर है जो तुरंत सहज नहीं हो सकता है।

आप मोंगो शेल से सत्यापित कर सकते हैं कि नई सूची और कार्यों को मोंगो में सहेजा गया था।

db.lists.find()
{ "tasks" : [
    {
        "_id" : ObjectId("4dd1cbeed77909f507000002"),
        "priority" : 1,
        "name" : "task one"
    },
    {
        "_id" : ObjectId("4dd1cbeed77909f507000003"),
        "priority" : 5,
        "name" : "task two"
    }
], "_id" : ObjectId("4dd1cbeed77909f507000001"), "name" : "Sample List" }

अब हम ObjectId . का उपयोग कर सकते हैं Sample List को ऊपर खींचने के लिए और अपने कार्यों के माध्यम से पुनरावृति करें।

List.findById('4dd1cbeed77909f507000001', function(err, list) {
    console.log(list.name + ' retrieved');
    list.tasks.forEach(function(task, index, array) {
        console.log(task.name);
        console.log(task.nameandpriority);
        console.log(task.isHighPriority());
    });
});

यदि आप उस अंतिम बिट कोड को चलाते हैं तो आपको यह कहते हुए एक त्रुटि मिलेगी कि एम्बेडेड दस्तावेज़ में कोई विधि नहीं है isHighPriority . Mongoose के वर्तमान संस्करण में आप सीधे एम्बेडेड स्कीमा पर विधियों तक नहीं पहुंच सकते हैं। इसे ठीक करने के लिए एक खुला टिकट है और Mongoose Google Group को प्रश्न प्रस्तुत करने के बाद, manimal45 ने अभी उपयोग करने के लिए एक उपयोगी वर्कअराउंड पोस्ट किया है।

List.findById('4dd1cbeed77909f507000001', function(err, list) {
    console.log(list.name + ' retrieved');
    list.tasks.forEach(function(task, index, array) {
        console.log(task.name);
        console.log(task.nameandpriority);
        console.log(task._schema.methods.isHighPriority.apply(task));
    });
});

यदि आप उस कोड को चलाते हैं तो आपको कमांड लाइन पर निम्न आउटपुट देखना चाहिए।

Sample List retrieved
task one
task one (1)
true
task two
task two (5)
false

उस कामकाज को ध्यान में रखते हुए आइए TaskSchema . को चालू करें एक नेवला मॉडल में।

mongoose.model('Task', TaskSchema);
 
var Task = mongoose.model('Task');
 
var ListSchema = new Schema({
    name: String,
    tasks: [Task.schema]
});
 
mongoose.model('List', ListSchema);
 
var List = mongoose.model('List');

TaskSchema परिभाषा पहले जैसी ही है इसलिए मैंने इसे छोड़ दिया। एक बार इसके मॉडल में बदल जाने के बाद भी हम डॉट नोटेशन का उपयोग करके इसके अंतर्निहित स्कीमा ऑब्जेक्ट तक पहुंच सकते हैं।

आइए एक नई सूची बनाएं और उसमें दो टास्क मॉडल इंस्टेंस एम्बेड करें।

var demoList = new List({name:'Demo List'});
 
var taskThree = new Task({name:'task three', priority:10});
var taskFour = new Task({name:'task four', priority:11});
 
demoList.tasks.push(taskThree.toObject(), taskFour.toObject());
 
demoList.save(function(err) {
    if (err) {
        console.log('error adding new list');
        console.log(err);
    } else {
        console.log('new list successfully saved'); 
    }
});

जैसा कि हम उस सूची में टास्क मॉडल इंस्टेंस को एम्बेड कर रहे हैं जिसे हम toObject . कह रहे हैं उन पर अपने डेटा को सादे JavaScript ऑब्जेक्ट में बदलने के लिए जो List.tasks DocumentArray उम्मीद कर रहा है। जब आप मॉडल इंस्टेंस को इस तरह सहेजते हैं तो आपके एम्बेडेड दस्तावेज़ों में ObjectIds होगा ।

पूरा कोड उदाहरण एक सार के रूप में उपलब्ध है। उम्मीद है कि जैसे-जैसे नेवला का विकास जारी रहेगा, ये कामकाज सुचारू रूप से चलने में मदद करेंगे। मैं अभी भी Mongoose और MongoDB के लिए काफी नया हूं इसलिए कृपया बेझिझक टिप्पणियों में बेहतर समाधान और सुझाव साझा करें। हैप्पी डेटा मॉडलिंग!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB दस्तावेज़ से किसी फ़ील्ड को पूरी तरह से कैसे हटाएं?

  2. मैं उस नल को कैसे क्रमबद्ध कर सकता हूं जिसे आखिरी बार मोंगोडब में आदेश दिया गया है?

  3. MongoDB:उप-दस्तावेज़ अपडेट कर रहा है

  4. एक कतार सेवा के रूप में MongoDB?

  5. पता लगाएं कि अगले 30 दिनों में मोंगो के साथ किसी को जन्मदिन मिला है या नहीं