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

Sim*_*aur 7 javascript arrays mongoose mongodb

我有这样的架构:

var CustomUserSchema = new Schema({
    role: [],
    permissions: [],
});
Run Code Online (Sandbox Code Playgroud)

permissions field存储一个如下所示的字符串数组:

["Delete", "Show","Create"]
Run Code Online (Sandbox Code Playgroud)

role field存储一个如下所示的对象数组:

[
    {
        name:"admin",
        priority:10,
        permissions: ["Delete", "Show" , "update"]
    },
    {
        name:"user",
        priority:5,
        permissions: ["Delete", "Show"]
    }
]
Run Code Online (Sandbox Code Playgroud)

现在,我的要求是能够存储"显示"为默认值permissions字段中架构和存储"用户"作为默认值角色名称字段,优先级0的内部的priorityrole场"秀"的permissionsrole领域.

试着自己,我想出了这个:

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'}]
});
Run Code Online (Sandbox Code Playgroud)

但它根本没有为字段分配默认值,而是为字段提供大小为0的数组.

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

Bla*_*ven 18

默认值实际上不适用于数组,除非它当然是数组中的文档,并且您希望在添加到数组时为该文档设置默认属性.

因此,数组总是初始化为"空",除非你故意在其中加入一些东西.为了实现您想要实现的目标,请添加一个预保存挂钩,用于检查空数组,然后在其中放置一个默认值:

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);
});
Run Code Online (Sandbox Code Playgroud)

这会创建空值:

{ __v: 0,
  _id: 55c2e3142ac7b30d062f9c38,
  permissions: [ 'Show' ] }
Run Code Online (Sandbox Code Playgroud)

当然,如果您初始化数据或操作以在数组中创建条目:

var user = new User({"permissions":["Create"]});
Run Code Online (Sandbox Code Playgroud)

然后你得到你添加的数组:

{ __v: 0,
  _id: 55c2e409ec7c812b06fb511d,
  permissions: [ 'Create' ] }
Run Code Online (Sandbox Code Playgroud)

如果你想"总是"在权限中出现"显示",那么对钩子的类似更改可以强制执行:

userSchema.pre("save",function(next) {
  if (this.permissions.indexOf("Show") == -1)
    this.permissions.push("Show");

  next();
});
Run Code Online (Sandbox Code Playgroud)

结果如下:

var user = new User({"permissions":["Create"]});

{ __v: 0,
  _id: 55c2e5052219b44e0648dfea,
  permissions: [ 'Create', 'Show' ] }
Run Code Online (Sandbox Code Playgroud)

这些是您可以控制数组条目的默认值的方法,而无需使用模型在代码中显式分配它们.

  • 很遗憾你不能默认定义数组值:( (2认同)