2013-11-04 121 views
14

貓鼬似乎默認爲使所有字段不是必需的。有沒有辦法讓所有在不改變各自所需的字段:使貓鼬需要的所有字段

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

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

它會得到十分可怕的,因爲我有很多的這些。

+1

如果需要所有字段,你爲什麼要使用一個無模式的數據庫? –

+3

無模式數據庫與必填字段無關,您可以在關係數據庫中使用非必填字段,反之亦然。 (在我看來) – fernandodof

回答

8

我落得這樣做:

r_string = 
    type: String 
    required: true 

r_number = 
    type: Number 
    required: true 

以及其他數據類型。

+0

你最終放置在哪裏? @ maxko87 – softcode

0

我不知道是否有這樣做的貓鼬更簡單的方法,但我會做以下在你的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等做T相同YPES。

3

那麼你可以編寫一個mongoose模式插件函數,它可以通過模式對象並調整它來使每個字段都是必需的。那麼你只需要每個模式1行:Dimension.plugin(allRequired)

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

所需屬性的隱式聲明只是將問題放在一邊,使其更加醜陋。 – Flint

2

貓鼬沒有提供設置所有字段的方法,但你可以遞歸地做。

像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 }); 
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() 
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; 
};