为什么我的架构没有在mongoose数组中添加默认值?

时间:2015-08-06 01:16:32

标签: javascript arrays mongodb mongoose

我有这样的架构:

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的数组。

以上架构似乎有什么问题? 如何将这些存储为默认值?

2 个答案:

答案 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']
    }
});