让所有的领域需要mongoose

mongoose似乎默认使所有的领域不需要。 有没有办法使所有的字段不需要改变:

Dimension = mongoose.Schema( name: String value: String ) 

 Dimension = mongoose.Schema( name: type: String required: true value: type: String required: true ) 

它会变得非常难看,因为我有很多这些。

你可以做这样的事情:

 var schema = { name: { type: String}, value: { type: String} }; var requiredAttrs = ['name', 'value']; for (attr in requiredAttrs) { schema[attr].required = true; } var Dimension = mongoose.schema(schema); 

或所有attrs(使用下划线,这是真棒):

 var schema = { name: { type: String}, value: { type: String} }; _.each(_.keys(schema), function (attr) { schema[attr].required = true; }); var Dimension = mongoose.schema(schema); 

我结束了这样做:

 r_string = type: String required: true r_number = type: Number required: true 

并为其他数据types。

所有字段属性都在schema.paths[attribute]schema.path(attribute) ;

一个正确的方法是:定义何时不需要字段,

 Schema = mongoose.Schema; var Myschema = new Schema({ name : { type:String }, type : { type:String, required:false } }) 

并使其全部都是默认需要的:

 function AllFieldsRequiredByDefautlt(schema) { for (var i in schema.paths) { var attribute = schema.paths[i] if (attribute.isRequired == undefined) { attribute.required(true); } } } AllFieldsRequiredByDefautlt(Myschema) 

下划线的方式:

 _=require('underscore') _.each(_.keys(schema.paths), function (attr) { if (schema.path(attr).isRequired == undefined) { schema.path(attr).required(true); } }) 

testing它:

 MyTable = mongoose.model('Myschema', Myschema); t = new MyTable() t.save() 

那么你可以编写一个mongoose模式插件函数,使用模式对象并调整它以使每个字段都是必需的。 那么你只需要每个模式一行: Dimension.plugin(allRequired)

mongoose没有提供设置所有字段的方法,但是您可以recursion地进行。

像Peter提到的那样,你可以插入它来重用代码。

recursion设置:

 // game.model.js var fields = require('./fields'); var Game = new Schema({ ... }); for(var p in Game.paths){ Game.path(p).required(true); } 

Pluginized:

 // fields.js module.exports = function (schema, options) { if (options && options.required) { for(var p in schema.paths){ schema.path(p).required(true); } } } // game.model.js var fields = require('./fields'); var Game = new Schema({ ... }); Game.plugin(fields, { required: true }); 

我不确定在Mongoose中是否有更简单的方法,但是我会在IDE /编辑器中执行以下操作:

列出你的领域,你通常会:

 Dimension = mongoose.Schema( name: String value: String ) 

然后做一个查找和replaceString ,并用{type: String, required: true},replace它{type: String, required: true},给你:

 Dimension = mongoose.Schema( name: {type: String, required: true}, value: {type: String, required: true}, ) 

然后对Number和其他types做同样的事情。

build立在以前的答案,下面的模块将使默认情况下所需的字段。 以前的答案没有recursion嵌套的对象/数组。

用法:

 const rSchema = require("rschema"); var mySchema = new rSchema({ request:{ key:String, value:String }, responses:[{ key:String, value:String }] }); 

节点模块:

 const Schema = require("mongoose").Schema; //Extends Mongoose Schema to require all fields by default module.exports = function(data){ //Recursive var makeRequired = function(schema){ for (var i in schema.paths) { var attribute = schema.paths[i]; if (attribute.isRequired == undefined) { attribute.required(true); } if (attribute.schema){ makeRequired(attribute.schema); } } }; var schema = new Schema(data); makeRequired(schema); return schema; };