Mongoose cho phép bạn "tách biệt" các định nghĩa lược đồ. Cả hai cho "tái sử dụng" chung và rõ ràng của mã. Vì vậy, cách tốt hơn để làm điều này là:
// 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 );
Vì vậy, nó "sạch" và "có thể sử dụng lại" nếu bạn sẵn sàng đưa các định nghĩa "Lược đồ" thành một phần của các mô-đun riêng lẻ và sử dụng hệ thống "request" để nhập khi cần thiết. Bạn thậm chí có thể "xem xét" các định nghĩa lược đồ từ các đối tượng "mô hình" nếu bạn không muốn "mô-đun hóa" mọi thứ.
Hầu hết, nó cho phép bạn chỉ định rõ ràng "những gì bạn muốn" cho các giá trị mặc định.
Đối với mặc định phức tạp hơn, bạn có thể muốn thực hiện việc này trong hook "pre save". Như một ví dụ đầy đủ hơn:
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();
}
);
Bạn có thể làm sạch điều đó và xem xét nội dung đường dẫn lược đồ để nhận các giá trị mặc định ở các cấp khác. Nhưng về cơ bản, bạn muốn nói rằng nếu mảng bên trong đó không được xác định thì bạn sẽ điền vào các giá trị mặc định như được mã hóa.