19

Mongoose 似乎默认使所有字段都不需要。有没有办法在不更改每个字段的情况下制作所有必需的字段:

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

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

它会变得非常丑陋,因为我有很多这样的东西。

4

7 回答 7

12

我最终这样做了:

r_string = 
  type: String
  required: true 

r_number = 
  type: Number
  required: true

以及其他数据类型。

于 2015-01-22T02:54:46.513 回答
11

您可以执行以下操作:

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

或者对于所有属性(使用下划线,这很棒):

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

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

var Dimension = mongoose.schema(schema);
于 2014-08-07T14:41:40.743 回答
6

所有字段属性都在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()
于 2015-02-06T12:40:42.157 回答
3

好吧,您可以编写一个猫鼬模式插件函数来遍历模式对象并对其进行调整以使每个字段都是必需的。然后,每个模式只需要 1 行:Dimension.plugin(allRequired).

于 2013-11-04T06:26:14.187 回答
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);
}

插件化:

// 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 });
于 2014-11-06T08:51:15.217 回答
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其他类型执行相同的操作。

于 2013-11-04T06:02:46.547 回答
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;
};
于 2017-05-04T21:14:10.827 回答