Пн goose - проверка документа, связанного с ObjectID - PullRequest
1 голос
/ 06 февраля 2020

Мне нужно при необходимости проверить поле «продукт» в Model Event. Product - ссылка ObjectID на модель продукта.

Я пробовал использовать эти 2 подхода, но он не проверяет

 product: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Product',
      required: true
    }]
  },



product: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Product',
      required: function () {
        return this.product.length > 0
      },
    }]
  },

Событие все равно создается, и когда я не добавляю никаких продуктов, поле product представляет собой пустой массив.

Есть идеи, как это проверить?

Модели:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Product = require('../models/Product');

const moment = require('moment');


const EventSchema = new Schema({

  client: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Client'
    }]
  },

  product: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Product',
      required: true
    }]
  },

  date: {
    type: Date,
    maxlength: 64,
    lowercase: true,
    trim: true
  },

  place: {
    type: String,
    maxlength: 1200,
    minlength: 1,
  },

  price: {
    type: Number
  },

  comment: {
    type: String,
    maxlength: 12000,
    minlength: 1,
  },

  status: {
    type: Number,
    min: 0,
    max: 1,
    default: 0,
    validate: {
      validator: Number.isInteger,
      message: '{VALUE} is not an integer value'
    }
  },
},
  {
    toObject: { virtuals: true },
    toJSON: { virtuals: true }
  },
  {
    timestamps: true
  },
);


const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Provider = require('./Provider')


const ProductSchema = new Schema({

  name: {
    type: String,
    maxlength: 64,
    minlength: 1,
    required: [true, 'Product name is required'],
  },

  brand: {
    type: String,
    maxlength: 64,
    minlength: 1,
  },

  description: {
    type: String,
    maxlength: 12000,
    min: 1,
  },

  comment: {
    type: String,
    maxlength: 12000,
    minlength: 1
  },

  state: {
    type: String,
    maxlength: 64,
    minlength: 0
  },

  disponible: {
    type: Boolean,
    default: true
  },

  price: {
    type: Number,
    default: 0,
    min: 0,
    max: 999999
  },

  provider: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Provider'
    }]
  },

  category: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Category'
    }]
  },

  event: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Event'
    }]
  },

  image: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Image'
    }]
  },
},
  {
    toObject: { virtuals: true },
    toJSON: { virtuals: true }
  },
  {
    timestamps: true
  });

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы можете использовать пользовательские валидаторы функцию mon goose.

Если функция валидатора возвращает неопределенное или истинное значение, проверка завершается успешно. Если он возвращает ложное значение (кроме неопределенного) или выдает ошибку, проверка завершается неудачей.

    product: {
      type: [
        {
          type: Schema.Types.ObjectId,
          ref: "Product",
          required: true
        }
      ],
      validate: {
        validator: function(v) {
          return v !== null && v.length > 0;
        },
        message: props => "product is null or empty"
      }
    }

Теперь, когда вы не отправляете поле продукта или не отправляете пустой массив, выдается ошибка проверки.

0 голосов
/ 06 февраля 2020
 const notEmpty = function(users){
   if(users.length === 0){return false}
   else { return true }
 }

 const EventSchema = new Schema({
  product: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'Product',
      required: true,
      validate: [notEmpty, 'Please add at least one']
    }]
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...