Mongoose ви позволява да "разделяте" дефинициите на схемата. Както за обща „повторна употреба“, така и за яснота на кода. Така че по-добрият начин да направите това е:
// 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();
}
);
Можете да изчистите това и да прегледате пътя на схемата, за да получите стойности по подразбиране на други нива. Но всъщност искате да кажете, че ако този вътрешен масив не е дефиниран, тогава ще попълните стойностите по подразбиране, както са кодирани.