Итак, у вас было несколько вещей в неправильных местах ваших попыток, и есть также лучшие способы справиться с этим
Просто используйте .updateOne()
непосредственно на модели вместо findById()
:
Work.updateOne(
{ "_id": req.params.id },
{
"$push": {
"workRating": {
"reviewerName": reviewerName,
"critique": critique,
"date": new Date()
},
"ratingNumber": req.body.clickedValue
},
"$inc": {
"ratingSum": req.body.clickedValue
}
},
function(err, response) {
// handling
}
)
.updateOne()
является «предпочтительным» в современном API, когда вы фактически хотите «обновить один» документ. Метод update()
делает то же самое и обновляет только «первое совпадение», но его использование считается «устаревшим» по сравнению с использованием более «описательного» метода в вашем коде.
Или, если вы действительно хотите, чтобы документ был возвращен .findByIdAndUpdate()
:
Work.findByIdAndUpdate(req.params.id,
{
"$push": {
"workRating": {
"reviewerName": reviewerName,
"critique": critique,
"date": new Date()
},
"ratingNumber": req.body.clickedValue
},
"$inc": {
"ratingSum": req.body.clickedValue
}
},
{ "new": true }, // need to get the "modified" document
function(err, foundWork) {
// handling
}
)
В ваших попытках были модификаторы в неправильном месте, и гораздо эффективнее просто "обновлять", когда вам на самом деле не нужно "извлекать".
Или по "не очень хорошему" шаблону "fetch / modify / save":
foundWork.workRating.push({
"reviewerName": reviewerName,
"critique": critique,
"date": new Date()
});
foundWork.ratingNumber.push(req.body.clickedValue);
foundWork.ratingSum = foundWork.ratinSum + 1;
foundWork.save(function(err,modifiedWork) {
// handling
});
Где вы снова действительно пытаетесь .push()
в неправильных местах.
Обратите внимание, что вы также можете добавить в свою схему:
"date": { "type": Date, "default": Date.now }
Который автоматически применит это значение ко всем операциям здесь, поскольку mongoose изменит операции обновления на основе настройки схемы.