猫鼬模式:强制互斥键

时间:2019-10-17 06:54:30

标签: mongoose mongoose-schema

我的API将接收的数据包含两个密钥之一,option1option2,但不是两个。

我想在我的猫鼬模式中强制执行该行为,但是什么也没找到,可以链接两个键并确保其中一个(只有一个)存在吗?

示例代码:

const exampleSchema = new mongoose.Schema({
  custRef: {
    type: String,
    required: true,
    trim: true
  },
  option1: {
    type: Number
  },
  option2: {
    type: Number
  }
});

示例JSON 1:

{
    "custRef": "abc123",
    "option1": 456
}

示例JSON 2:

{
    "custRef": "abc789",
    "option2": 010
}

1 个答案:

答案 0 :(得分:0)

您可以使用这样的预验证钩子:

(请注意,为简单起见,我删除了custRef字段)

const mongoose = require("mongoose");

const exampleSchema = new mongoose.Schema({
  option1: {
    type: Number
  },
  option2: {
    type: Number
  }
});

exampleSchema.pre("validate", function(next) {
  //console.log(this);
  if (this.option1 && this.option2) {
    let err = new Error("Both options not allowed");
    err.status = 400;
    next(err);
  } else if (!(this.option1 || this.option2)) {
    let err = new Error("One of the options is required");
    err.status = 400;
    next(err);
  }

  next();
});

const Example = mongoose.model("Example", exampleSchema);

const example = new Example({});

example.validate().catch(err => {
  console.log(err.message);
});


这可能不适用于更新操作,所以要小心。

文档:

https://mongoosejs.com/docs/middleware.html#order