#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
, может быть, он содержит это число.