使Mongoose中需要所有字段

时间:2013-11-04 05:57:42

标签: node.js mongodb mongoose schema

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

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

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

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

7 个答案:

答案 0 :(得分: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);

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

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

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

var Dimension = mongoose.schema(schema);

答案 1 :(得分:9)

我最终这样做了:

r_string = 
  type: String
  required: true 

r_number = 
  type: Number
  required: true

以及其他数据类型。

答案 2 :(得分:4)

所有字段属性均位于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);
    }
})

测试它:

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

答案 3 :(得分:3)

那么你可以编写一个mongoose模式插件函数,该函数遍历模式对象并对其进行调整以使每个字段都需要。然后,每个架构只需要1行:Dimension.plugin(allRequired)

答案 4 :(得分:2)

Mongoose没有提供设置所有字段的方法,但你可以递归地进行。

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

递归设置:

// 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 });

答案 5 :(得分:0)

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

按正常方式列出您的字段:

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

然后在String上进行查找和替换,并将其替换为{type: String, required: true},给您:

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

然后为Number和其他类型做同样的事情。

答案 6 :(得分:0)

在前面的答案的基础上,下面的模块将默认需要字段。以前的答案没有递归嵌套对象/数组。

用法:

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;
};