Mongoose findByIdAndUpdate сбрасывает значения по умолчанию в моей базе данных MongoDB

#javascript #mongodb #mongoose

#javascript #mongodb #mongoose

Вопрос:

У меня есть модель в моей базе данных MongoDB под названием «Отзывы», которая содержит поле под названием «Отзывы». Когда кто-то нажимает на кнопку «мне нравится» в пользовательском интерфейсе, я использую findByIdAndUpdate, чтобы увеличить количество лайков на 1. Это работает, однако, когда это происходит, он также сбрасывает ряд значений по умолчанию в базе данных. Есть ли что-то другое, что я должен использовать здесь, чтобы предотвратить сброс? Включая код, который обновляет поле ниже.

 exports.updateOne = (Model) =>
  catchAsync(async (req, res, next) => {
    const doc = await Model.findByIdAndUpdate(req.params.id, req.body, {
      new: true,
      runValidators: true,
    });

    if (!doc) {
      return next(new AppError('No document found with that ID!', 404));
    }

    res.status(200).json({
      status: 'Success',
      data: {
        data: doc,
      },
    });
  });
  

Что сбрасывается? В отдельной модели обзор используется для вычисления «ratingsAverage». Включая модель ниже. Это число сбрасывается до значения по умолчанию «3».

 const shipSchema = new mongoose.Schema({
  shipName: {
    type: String,
    required: [true, 'A ship name is required.'],
    maxlength: [60, 'That ship name is too long, please try again.'],
    unique: [true, 'Ship name already exists.'],
  },
  slug: String,
  builtDate: {
    type: Date,
    required: [true, 'Ship built date is required.'],
  },
  ratingsAverage: {
    type: Number,
    default: 3,
    min: [1, 'Minimum rating is 1. Please try again.'],
    max: [5, 'Max rating is 5. Please try again.'],
  },
  ratingsQuantity: {
    type: Number,
    default: 0,
  },
  ratingsAverageDining: {
    type: Number,
    default: 3,
    min: [1, 'Minimum rating is 1. Please try again.'],
    max: [5, 'Max rating is 5. Please try again.'],
  },
  ratingsAverageCabin: {
    type: Number,
    default: 3,
    min: [1, 'Minimum rating is 1. Please try again.'],
    max: [5, 'Max rating is 5. Please try again.'],
  },
  ratingsAverageKids: {
    type: Number,
    default: 3,
    min: [1, 'Minimum rating is 1. Please try again.'],
    max: [5, 'Max rating is 5. Please try again.'],
  },
  ratingsAverageValue: {
    type: Number,
    default: 3,
    min: [1, 'Minimum rating is 1. Please try again.'],
    max: [5, 'Max rating is 5. Please try again.'],
  },
  ratingsAverageEnt: {
    type: Number,
    default: 3,
    min: [1, 'Minimum rating is 1. Please try again.'],
    max: [5, 'Max rating is 5. Please try again.'],
  },
  maidenVoyageDate: {
    type: Date,
    required: [true, 'Maiden voyage date is required.'],
  },
  cruiseLine: {
    type: String,
    required: [true, 'Ship cruise line is required.'],
  },
  maxCapacity: {
    type: Number,
    required: [true, 'Max ship capacity is required.'],
  },
  shipCost: {
    type: Number,
    required: [true, 'Ship cost is required.'],
  },
  shipBuilderName: {
    type: String,
    required: [true, 'Ship builder name is required.'],
  },
  shipWeight: {
    type: Number,
    required: [true, 'Ship weight is required.'],
  },
  shipStatus: {
    type: String,
    enum: {
      values: ['active', 'inactive'],
      message: 'Ship status must be active or inactive.',
    },
    required: [true, 'Ship status is required.'],
  },
  shipRegistry: {
    type: String,
    required: [true, 'Location of ship registry is required.'],
  },
  shipIdentification: {
    shipCallsign: {
      type: String,
      required: [true, 'Ship callsign is required.'],
      unique: [true, 'Call sign already exists.'],
    },
    shipIMONumber: {
      type: Number,
      required: [true, 'Ship IMO number is required.'],
      unique: [true, 'IMO number already exists.'],
    },
    shipMMSINumber: {
      type: Number,
      required: [true, 'Ship MMSI number is required.'],
      unique: [true, 'MMSI number already exists.'],
    },
  },
  shipPhoto: {
    type: String,
    default: 'default.jpg',
  },
});

//Virtual populate
shipSchema.virtual('reviews', {
  ref: 'Review',
  foreignField: 'ship',
  localField: '_id',
});

shipSchema.pre('save', function (next) {
  this.shipPhoto = `${this.shipName}.jpg`;
  this.shipPhoto = this.shipPhoto.split(' ').join('').toLowerCase();
  next();
});

shipSchema.pre('save', function (next) {
  this.slug = slugify(this.shipName, { lower: true });
  next();
});

shipSchema.pre('save', function (next) {
  if (this.ratingsAverage > 4.5) {
    this.starDisplay = 10;
  }
  next();
});

const Ship = mongoose.model('Ship', shipSchema);

module.exports = Ship;
  

Комментарии:

1. что это значит? > сбрасывает количество значений по умолчанию в базе данных

2. Извините. Отредактировано для включения более подробной информации.

3. вы должны использовать `{$set:{req.body}}`…

4. Проверьте, какой у вас req.body , может быть, он содержит это число.