我有这样的架构:
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
字段的默认值,并存储用户'作为角色字段内名称的默认值,priority
字段内role
的优先级为0,'显示' permissions
字段内的role
。
尝试自己,我想出了这个:
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的数组。
以上架构似乎有什么问题? 如何将这些存储为默认值?
答案 0 :(得分:16)
默认值实际上不适用于数组,除非它是数组中的文档,并且您希望在添加到数组时为该文档设置默认属性。
因此,数组始终初始化为"空"除非你故意在其中加入一些东西。为了做你想要实现的目标,然后添加一个检查空数组的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' ] }
如果你想"总是"有"显示"出现在权限中,然后对钩子的类似更改可以强制执行:
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' ] }
这些是您可以控制数组条目默认值的方法,而无需使用模型在代码中明确指定它们。
答案 1 :(得分:4)
您可以通过这种方式以mongoose添加默认数组值 -
var CustomUserSchema = new Schema({
role: {
type: Array,
default: {
name: 'user',
priority: 0,
permissions: ['Show']
}
},
permissions: {
type: [String],
default: ['Show']
}
});