Mongooseでは、デフォルトですべてのフィールドが必須ではないようです。それぞれを変更せずに、必要なすべてのフィールドを作成する方法はありますか?
Dimension = mongoose.Schema(
name: String
value: String
)
に
Dimension = mongoose.Schema(
name:
type: String
required: true
value:
type: String
required: true
)
私はこれらをたくさん持っているので、それは本当に醜くなるでしょう。
私はこれをすることになった:
r_string =
type: String
required: true
r_number =
type: Number
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);
またはすべての属性(アンダースコアを使用、これは素晴らしいです):
var schema = {
name: { type: String},
value: { type: String}
};
_.each(_.keys(schema), function (attr) { schema[attr].required = true; });
var Dimension = mongoose.schema(schema);
すべてのフィールドプロパティは_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()
_
スキーマオブジェクトをウォークし、各フィールドが必須になるように調整するマングーススキーマプラグイン関数を作成できます。次に、スキーマごとに1行だけ必要です:Dimension.plugin(allRequired)
。
マングースはすべてのフィールドを設定する方法を提供していませんでしたが、再帰的に設定することができました。
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 });
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
と他の型についても同じようにします。
前の回答に基づいて、以下のモジュールはデフォルトで必須のフィールドを作成します。以前の回答では、ネストされたオブジェクト/配列は再帰されませんでした。
使用法:
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;
};