web-dev-qa-db-ja.com

Mongooseですべてのフィールドを必須にする

Mongooseでは、デフォルトですべてのフィールドが必須ではないようです。それぞれを変更せずに、必要なすべてのフィールドを作成する方法はありますか?

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

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

私はこれらをたくさん持っているので、それは本当に醜くなるでしょう。

16
maxko87

私はこれをすることになった:

r_string = 
  type: String
  required: true 

r_number = 
  type: Number
  required: true

その他のデータ型についても同様です。

9
maxko87

あなたは次のようなことをすることができます:

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

すべてのフィールドプロパティは_schema.paths[attribute]_またはschema.path(attribute)にあります。

適切な方法の1つ:フィールドが不要な場合を定義します。

_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()
_
6
Flint

スキーマオブジェクトをウォークし、各フィールドが必須になるように調整するマングーススキーマプラグイン関数を作成できます。次に、スキーマごとに1行だけ必要です:Dimension.plugin(allRequired)

3
Peter Lyons

マングースはすべてのフィールドを設定する方法を提供していませんでしたが、再帰的に設定することができました。

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 });
2
chuyik

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と他の型についても同じようにします。

0
Samuel O'Malley

前の回答に基づいて、以下のモジュールはデフォルトで必須のフィールドを作成します。以前の回答では、ネストされたオブジェクト/配列は再帰されませんでした。

使用法:

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