【问题标题】:Why doesn't my schema to add default values in mongoose arrays?为什么我的架构不在猫鼬数组中添加默认值?
【发布时间】:2017-09-29 17:33:40
【问题描述】:

我有这样的架构:

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 的优先级为 0 role 字段和 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'}]
});

但它根本没有为字段分配默认值,而是给字段一个大小为 0 的数组。

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

【问题讨论】:

    标签: javascript arrays mongodb mongoose


    【解决方案1】:

    默认值确实不适用于数组,除非它当然是数组中的一个文档,并且您想在添加到数组时为该文档设置一个默认属性。

    因此,数组总是被初始化为“空”,除非你故意往里面放一些东西。为了做你想做的事情,然后添加一个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' ] }
    

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

    【讨论】:

    • 完美 :) 感谢一百万次。
    • 很遗憾你不能默认定义数组值:(
    • 感谢您的解决方案,在我的情况下,我使用bulkWrite,不幸的是,它不会触发非中间件,任何批量写入的解决方案?
    【解决方案2】:

    您可以通过这种方式在 mongoose 中添加默认数组值 -

    var CustomUserSchema = new Schema({
        role: {
            type: Array, 
            default: {
                name: 'user', 
                priority: 0, 
                permissions: ['Show']
            }
        },
        permissions: {
            type: [String], 
            default: ['Show']
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 2016-06-20
      • 2018-12-03
      • 1970-01-01
      • 2013-04-16
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多