नेवला आपको स्कीमा परिभाषाओं को "अलग" करने की अनुमति देता है। दोनों सामान्य "पुन:उपयोग" और कोड की स्पष्टता के लिए। तो ऐसा करने का एक बेहतर तरीका है:
// general imports
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
// schema for params
var paramSchema = new Schema({
"name": { "type": String, "default": "something" },
"value": { "type": String, "default": "something" }
});
// schema for features
var featureSchema = new Schema({
"name": { "type": String, "default": "something" }
"params": [paramSchema]
});
var appSchema = new Schema({
"appFeatures": [featureSchema]
});
// Export something - or whatever you like
module.export.App = mongoose.model( "App", appSchema );
तो यह "साफ" है, और "पुन:उपयोग करने योग्य" है यदि आप "स्कीमा" परिभाषाओं को अलग-अलग मॉड्यूल का हिस्सा बनाने के इच्छुक हैं और आवश्यकतानुसार आयात करने के लिए "आवश्यकता" प्रणाली का उपयोग करते हैं। यदि आप सब कुछ "मॉड्यूल" नहीं करना चाहते हैं तो आप "मॉडल" ऑब्जेक्ट्स से स्कीमा परिभाषाओं को "आत्मनिरीक्षण" भी कर सकते हैं।
अधिकतर हालांकि, यह आपको डिफ़ॉल्ट रूप से "आप क्या चाहते हैं" स्पष्ट रूप से निर्दिष्ट करने की अनुमति देता है।
के माध्यम से अधिक जटिल डिफ़ॉल्ट के लिए, आप शायद इसके बजाय "प्री सेव" हुक में ऐसा करना चाहते हैं। अधिक संपूर्ण उदाहरण के रूप में:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
var paramSchema = new Schema({
"name": { "type": String, "default": "something" },
"value": { "type": String, "default": "something" }
});
var featureSchema = new Schema({
"name": { "type": String, "default": "something" },
"params": [paramSchema]
});
var appSchema = new Schema({
"appFeatures": [featureSchema]
});
appSchema.pre("save",function(next) {
if ( !this.appFeatures || this.appFeatures.length == 0 ) {
this.appFeatures = [];
this.appFeatures.push({
"name": "something",
"params": []
})
}
this.appFeatures.forEach(function(feature) {
if ( !feature.params || feature.params.length == 0 ) {
feature.params = [];
feature.params.push(
{ "name": "a", "value": "A" },
{ "name": "b", "value": "B" }
);
}
});
next();
});
var App = mongoose.model( 'App', appSchema );
mongoose.connect('mongodb://localhost/test');
async.series(
[
function(callback) {
App.remove({},function(err,res) {
if (err) throw err;
callback(err,res);
});
},
function(callback) {
var app = new App();
app.save(function(err,doc) {
if (err) throw err;
console.log(
JSON.stringify( doc, undefined, 4 )
);
callback()
});
},
function(callback) {
App.find({},function(err,docs) {
if (err) throw err;
console.log(
JSON.stringify( docs, undefined, 4 )
);
callback();
});
}
],
function(err) {
if (err) throw err;
console.log("done");
mongoose.disconnect();
}
);
आप इसे साफ कर सकते हैं और अन्य स्तरों पर डिफ़ॉल्ट मान प्राप्त करने के लिए स्कीमा पथ का आत्मनिरीक्षण कर सकते हैं। लेकिन आप मूल रूप से यह कहना चाहते हैं कि यदि उस आंतरिक सरणी को परिभाषित नहीं किया गया है तो आप डिफ़ॉल्ट मानों को कोडित के रूप में भरने जा रहे हैं।