使Mongoose中需要所有字段

max*_*o87 16 schema mongoose mongodb node.js

Mongoose似乎默认使所有字段不是必需的.是否有任何方法可以在不更改每个字段的情况下生成所有字段:

Dimension = mongoose.Schema(
  name: String
  value: String
)
Run Code Online (Sandbox Code Playgroud)

Dimension = mongoose.Schema(
  name:
    type: String
    required: true
  value: 
    type: String
    required: true
)
Run Code Online (Sandbox Code Playgroud)

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

190*_*Man 10

你可以这样做:

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);
Run Code Online (Sandbox Code Playgroud)

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

var schema = {
  name: { type: String},
  value: { type: String}
};

_.each(_.keys(schema), function (attr) { schema[attr].required = true; });

var Dimension = mongoose.schema(schema);
Run Code Online (Sandbox Code Playgroud)

  • 隐含的所需属性声明只是将问题放在一边,使其更加丑陋. (5认同)

max*_*o87 9

我最终这样做了:

r_string = 
  type: String
  required: true 

r_number = 
  type: Number
  required: true
Run Code Online (Sandbox Code Playgroud)

以及其他数据类型.


Fli*_*int 6

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

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

Schema = mongoose.Schema;
var Myschema = new Schema({
    name : { type:String },
    type : { type:String, required:false }
})
Run Code Online (Sandbox Code Playgroud)

并默认使它们全部必需:

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

AllFieldsRequiredByDefautlt(Myschema)
Run Code Online (Sandbox Code Playgroud)

下划线方式:

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

测试一下:

MyTable = mongoose.model('Myschema', Myschema);
t = new MyTable()
t.save()
Run Code Online (Sandbox Code Playgroud)