2012-04-10 12 views
35

मैंने अभी मोंगोज़ के साथ शुरुआत की है। मेरे पास मोंगोज़ के साथ एक सृजन स्क्रिप्ट है जो नमूना डेटा के साथ स्कीमा और डीबी बनाता है।mongoose स्कीमा निर्माण

अब मैं वास्तविक एप्लिकेशन लिखता हूं। जब भी मेरा एप्लिकेशन चलता है, क्या मुझे स्कीमा ऑब्जेक्ट बनाने की ज़रूरत है, या यह किसी भी तरह से पहले से उपलब्ध है?

var Comments = new Schema({ 
    title  : String 
    , body  : String 
    , date  : Date 
}); 

कैसे होगा जवाब परिवर्तन करता है, तो मेरे पास है setters/सत्यापन/आदि:

दूसरे शब्दों में मैं db या सिर्फ पहली बार उपयोग करने के लिए नेवला का उपयोग करता है हर ऐप्लिकेशन में इस कोड को चलाने के लिए की जरूरत है ?

उत्तर

71

एक Schema परिभाषित करता है, इसलिए एप्लिकेशन समझता है कि मोंगो डीबी से डेटा को जावास्क्रिप्ट ऑब्जेक्ट्स में कैसे मैप करना है। Schema आवेदन का एक हिस्सा है। इसमें डेटाबेस के साथ करने के लिए कुछ भी नहीं है। यह केवल जावास्क्रिप्ट ऑब्जेक्ट्स में डेटाबेस को मानचित्र करता है। तो हाँ - अगर आप अच्छा मानचित्रण करना चाहते हैं तो आपको में प्रत्येक एप्लिकेशन को चलाने की आवश्यकता है, जिसकी आवश्यकता है। यह गेटर्स/सेटर्स/सत्यापन/आदि पर भी लागू होता है। हालांकि कि ऐसा करने

नोट:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; // <-- EDIT: missing in the original post 
var Comments = new Schema({ 
    title  : String 
    , body  : String 
    , date  : Date 
}); 
mongoose.model("Comments", Comments); 

globaly Schema रजिस्टर करेंगे। इसका मतलब यह है कि यदि आवेदन आप चल रहे हैं कुछ बाहरी मॉड्यूल का उपयोग कर रहा है, तो इस मॉड्यूल में आप बस का उपयोग कर सकते

var mongoose = require('mongoose'); 
var Comments = mongoose.model("Comments"); 
Comments.find(function(err, comments) { 
    // some code here 
}); 

(ध्यान दें कि आप वास्तव में इस कोड का उपयोग करने से पहले Schema रजिस्टर करने की आवश्यकता है, अन्यथा एक अपवाद नहीं होगा फेंक दिया)।

हालांकि यह सब केवल एक नोड सत्र के अंदर काम करता है, इसलिए यदि आप एक और नोड ऐप चला रहे हैं जिसके लिए Schema तक पहुंच की आवश्यकता है, तो आपको पंजीकरण कोड को कॉल करने की आवश्यकता है। तो यह अलग फ़ाइलों में सभी स्कीमा को परिभाषित करने के लिए एक अच्छा विचार है, उदाहरण के लिए comments.js फिर फ़ाइल models.js जो इस

var models = ['comments.js', 'someothermodel.js', ...]; 

exports.initialize = function() { 
    var l = models.length; 
    for (var i = 0; i < l; i++) { 
     require(models[i])(); 
    } 
}; 

की तरह लग रहे हो सकता है अब बुला require('models.js').initialize(); सभी प्रारंभ हो जाएगा बनाने के इस

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; // <-- EDIT: missing in the original post 

module.exports = function() { 
    var Comments = new Schema({ 
     title  : String 
     , body  : String 
     , date  : Date 
    }); 
    mongoose.model("Comments", Comments); 
}; 

की तरह लग सकता है किसी दिए गए नोड सत्र के लिए अपने स्कीमा का।

+0

हाँ, यह अच्छा है। इस विधि का उपयोग करते हुए, क्या आपके पास निर्भरता (एम्बेडेड दस्तावेज़) से निपटने के तरीके पर कोई विचार है? –

+1

@AdrienSchuler निर्भरताओं के साथ कोई समस्या नहीं है। आप फ़ाइलों में से एक में सामान्य रूप से एंबेडेड दस्तावेज़ों को परिभाषित करते हैं। बस सुनिश्चित करें कि अगर फ़ाइल 'second.js' फ़ाइल' first.js' में मॉडल को संदर्भित करती है, तो 'first.js'' model. variable में 'second.js' से पहले चला जाता है। – freakish

+0

यह बहुत अच्छा लगता है, मैं कोशिश कर रहा हूँ, धन्यवाद! –

4

हर बार जब आप अपने ऐप के स्कीमा को मोंगोस के साथ पंजीकृत करने के लिए अपना ऐप चलाते हैं तो आपको यह प्रारंभिक कोड चलाने की आवश्यकता होती है।

जब आपका ऐप समाप्त होता है, तो मोंगोज़ आपकी स्कीमा को स्टोर नहीं करता है। इसलिए, अगली बार जब आप स्कीमा का उपयोग करते हुए एक ऐप चलाते हैं, तो आपको अपनी स्कीमा फिर से पंजीकृत करने की आवश्यकता होती है।

हालांकि, ऐसा करने के लिए अपने ऐप को सेट करना काफी आसान है।

यहां कोड के दो लिंक हैं जो दर्शाते हैं कि कोई भी मोंगोस में स्कीमा कैसे शुरू कर सकता है। पहला जावास्क्रिप्ट में है, दूसरा कॉफीस्क्रिप्ट में है।

https://github.com/fbeshears/register_models

https://github.com/fbeshears/register_coffee_models

जावास्क्रिप्ट क़ौम सिर्फ एक एप्लिकेशन है।

कॉफीस्क्रिप्ट कोड में दो अलग-अलग ऐप्स हैं। मोंगोडीबी के साथ पहले स्टोर्स दस्तावेज, दूसरा खोजता है और पहले ऐप द्वारा संग्रहीत दस्तावेजों को प्रदर्शित करता है।

संबंधित मुद्दे