我有这样的架构:
var CustomUserSchema = new Schema({
role: [],
permissions: [],
});
permissions
字段存储一个字符串数组,如下所示:
["Delete", "Show","Create"]
而
role
字段存储一个对象数组,如下所示:
[
{
name:"admin",
priority:10,
permissions: ["Delete", "Show" , "update"]
},
{
name:"user",
priority:5,
permissions: ["Delete", "Show"]
}
]
现在,我的要求是能够将“显示”存储为架构中 permissions
字段的默认值,并将“用户”存储为 Angular 色字段内名称的默认值,优先级 0用于 role
字段内的 priority
和 role
字段内的 permissions
的“显示”。
尝试自己,我想出了这个:
var CustomUserSchema = new Schema({
role: [{
name: {type: String, default: 'user'},
priority:{ type: Number, default: 0 } ,
permissions: [{type:String, default:'Show'}]
}],
permissions: [{type:String, default:'Show'}]
});
但它根本没有为字段分配默认值,而是给字段一个大小为 0 的数组。
上述架构似乎有什么问题? 如何将这些存储为默认值?
最佳答案
默认值确实不适用于数组,除非它当然是数组中的一个文档,并且您想在添加到数组时为该文档设置一个默认属性。
因此,数组总是被初始化为“空”,除非你故意往里面放一些东西。为了做你想要实现的,然后添加一个pre save hook它检查一个空数组,然后在其中放置一个默认值:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/authtest');
var userSchema = new Schema({
permissions:[{
"type": String,
"enum": ["Delete","Show","Create","Update"],
}]
});
userSchema.pre("save",function(next) {
if (this.permissions.length == 0)
this.permissions.push("Show");
next();
});
var User = mongoose.model( 'User', userSchema );
var user = new User();
user.save(function(err,user) {
if (err) throw err;
console.log(user);
});
创建空的值:
{ __v: 0,
_id: 55c2e3142ac7b30d062f9c38,
permissions: [ 'Show' ] }
当然,如果您初始化数据或操作以在数组中创建一个条目:
var user = new User({"permissions":["Create"]});
然后你得到你添加的数组:
{ __v: 0,
_id: 55c2e409ec7c812b06fb511d,
permissions: [ 'Create' ] }
如果您想“始终”在权限中显示“显示”,那么对钩子(Hook)进行类似的更改可以为您强制执行:
userSchema.pre("save",function(next) {
if (this.permissions.indexOf("Show") == -1)
this.permissions.push("Show");
next();
});
结果:
var user = new User({"permissions":["Create"]});
{ __v: 0,
_id: 55c2e5052219b44e0648dfea,
permissions: [ 'Create', 'Show' ] }
您可以通过这些方式控制数组条目的默认值,而无需使用模型在代码中显式分配它们。
关于javascript - 为什么我的架构不在 Mongoose 数组中添加默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31845282/