Схема Mongoose: применение взаимоисключающих ключей - PullRequest
0 голосов
/ 17 октября 2019

Данные, которые получит мой API, содержат один из двух ключей, option1 или option2, но не оба.

Я хочу применить это поведение в моей схеме mongoose, но не нашел ничего, что могло бы сделатьесть ли способ связать два ключа и убедиться, что один (и только один) из них существует?

Пример кода:

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 голосов
/ 17 октября 2019

Вы можете использовать ловушку предварительной проверки следующим образом:

(обратите внимание, что я удалил поле 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

...