MongoDB атомарно обновляет пользовательские рейтинги, используя управление версиями документов

Я реализую API-интерфейс пользовательского обзора с бэкэндом mongodb. Коллекция обзоров имеет следующую схему.

      {
"reviewCount":10,
"reviewSum":34,
"ratings":3.4
}

Мой текущий подход к обновлению рейтинга — получение документа обзора. Обновите обзор, используя скользящее среднее значение, и обновите документ. Теперь этот подход может привести к устаревшим значениям, и в рейтинге будут отсутствовать некоторые обновления. Итак, я подумал о следующем

  1. используйте findOneAndModify (mongoose), чтобы получить текущий снимок документа, а также одновременно обновить документ с идентификатором версии

  2. Выполнение операций над рейтингом (скользящее среднее)

  3. Обновите документ на основе фильтра, который включает мой идентификатор версии. Это гарантирует, что если после получения моментального снимка кто-то другой попытается обновить обзоры, это приведет к тому, что идентификатор версии не будет соответствовать, поэтому обновление не будет применено.

            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})
    

это сработает? или мне все еще не хватает некоторых крайних случаев

0 ответов

Другие вопросы по тегам