Mongoose似乎默认使所有字段不是必需的。是否有任何方法可以在不改变每个字段的情况下完成所有字段:
Dimension = mongoose.Schema(
name: String
value: String
)
到
Dimension = mongoose.Schema(
name:
type: String
required: true
value:
type: String
required: true
)
因为我有很多这些,所以会变得非常难看。
答案 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;
};