Luwak memungkinkan Anda untuk "memisahkan" definisi skema. Baik untuk "penggunaan ulang" umum dan kejelasan kode. Jadi cara yang lebih baik untuk melakukannya adalah:
// 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 );
Jadi "bersih", dan "dapat digunakan kembali" jika Anda bersedia menjadikan definisi "Skema" sebagai bagian dari modul individual dan menggunakan sistem "memerlukan" untuk mengimpor sesuai kebutuhan. Anda bahkan dapat "mengintrospeksi" definisi skema dari objek "model" jika Anda tidak ingin "memodulasi" semuanya.
Namun sebagian besar, ini memungkinkan Anda untuk menentukan dengan jelas "apa yang Anda inginkan" untuk default.
Untuk default yang lebih kompleks, Anda mungkin ingin melakukan ini di hook "pra simpan". Sebagai contoh yang lebih lengkap:
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();
}
);
Anda bisa membersihkannya dan mengintrospeksi jalur skema untuk mendapatkan nilai default di level lain. Tetapi pada dasarnya Anda ingin mengatakan jika array dalam tidak didefinisikan maka Anda akan mengisi nilai default sebagai kode.