javascript - 为什么我的架构不在 Mongoose 数组中添加默认值?

标签 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 字段的默认值,并将“用户”存储为 Angular 色字段内名称的默认值,优先级 0用于 role 字段内的 priorityrole 字段内的 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/

相关文章:

c - C 中 union 的内存分配

javascript - 通过 Javascript 在各种浏览器窗口/选项卡中维护 iFrame 页面的状态

javascript - 比较两个数组并创建一个具有差异的新数组,并考虑重复项

javascript - 数组拼接产生意外结果

performance - MongoDB 数据模式性能

node.js - 监听 "mongojs"连接错误

Java Spring Boot 应用程序无法检测到 Mongodb 存储库

javascript - Twitter Bootstrap 下拉事件未在触摸设备上触发

javascript - dotVVM 将值从数据绑定(bind)的 DOM 元素传递到 JavaScript 变量以进行可视化

python - 在 numpy 中组合两个数组,