【问题标题】:Mongoose require a field based on some enum values of another fieldMongoose 需要一个基于另一个字段的一些枚举值的字段
【发布时间】:2021-06-09 23:18:06
【问题描述】:

我有一个 Mongoose 架构 Employee。我想为员工存储一个与办公室相关的字段(电话号码),前提是他/她有资格担任办公室,仅适用于“高级”和“c级”两个级别。

架构:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
var EmployeeSchema = new Schema({
    name: String,
    designation: String,
    level: {
        type: String,
        enum: ["intern", "junior", "mid-level", "senior", "c-level"],
        required: true,
    },
    phoneNo: { type: String, required: true },
    officePhoneNo: { type: String, required: true } // How to require only if the level is senior or c-level?,
});

感谢您的帮助。

谢谢

【问题讨论】:

  • 你想要一个“自定义验证器”。 mongoose manual 中讨论了更高级的验证
  • 谢谢@NeilLunn,我会仔细阅读手册:)

标签: node.js mongoose mongoose-schema


【解决方案1】:

在 Mongoose 中,您可以在 required 中传递一个函数,该函数可以根据某些条件返回 true/false

也可以将一个字段的required 依赖于其他字段,在您的情况下为level。也就是说,您可以选择要求一个字段。方法如下:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const levels = ["intern", "junior", "mid-level", "senior", "c-level"];
const levelsEligibleForOffice = ["senior", "c-level"];

var EmployeeSchema = new Schema({
    name: String,
    designation: String,
    level: {type: String, enum: levels, required: true},
    phoneNo: {type: String, required: true},
    officePhoneNo: {type: String, required: isEligibleForOffice}
});


function isEligibleForOffice(){
    if(levelsEligibleForOffice.indexOf(this.level) > -1){  //"this" contains the employee document at the time of required validation
        return true;
    }
    return false;
}

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 2015-04-09
    • 2010-11-13
    • 2019-04-14
    • 2020-09-06
    • 2017-09-11
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多