MongoDB атомарно обновляет пользовательские рейтинги, используя управление версиями документов
Я реализую API-интерфейс пользовательского обзора с бэкэндом mongodb. Коллекция обзоров имеет следующую схему.
{
"reviewCount":10,
"reviewSum":34,
"ratings":3.4
}
Мой текущий подход к обновлению рейтинга — получение документа обзора. Обновите обзор, используя скользящее среднее значение, и обновите документ. Теперь этот подход может привести к устаревшим значениям, и в рейтинге будут отсутствовать некоторые обновления. Итак, я подумал о следующем
используйте findOneAndModify (mongoose), чтобы получить текущий снимок документа, а также одновременно обновить документ с идентификатором версии
Выполнение операций над рейтингом (скользящее среднее)
Обновите документ на основе фильтра, который включает мой идентификатор версии. Это гарантирует, что если после получения моментального снимка кто-то другой попытается обновить обзоры, это приведет к тому, что идентификатор версии не будет соответствовать, поэтому обновление не будет применено.
let versionId = uuid(); let reviewDoc = await findOneAndModify({_id:reviewId}, {versionId:versionId}); let newRatingCount = reviewDoc.ratingCount + 1; let newRatingSum = reviewDoc.ratingSum + currentRating; let newRating = (newRatingSum)/(newRatingCount); let updatedDoc = await Reviews.updateOne({versionId}, {rating:newRating, ratingSum:newRatingSum, ratingCount:newRtingCount})
это сработает? или мне все еще не хватает некоторых крайних случаев