Задать вопрос
@ligedark_general
Программист. Другие IT услуги

Как реализовать функцию с использованием MongoDB?

Я только недавно стал изучать MongoDB.
Решил написать функцию, которая каждый час из базы данных вытаскивает массив объектов пользователей, сравнивает по значению, которое ранее указано, и если значение превысило пороговую отметку, то совершает действие: повышает уровень и вычитает пороговое значение из переменной пользователя, отвечающее за опыт пользователя.

Суть вопроса: "Как реализовать это более оптимизированно, чтобы совершалось как можно меньше запросов к БД?"
Предполагаемая логика функции:
Вытащить массив с объектами пользователей,
Сверить с пороговым значением опыт каждого пользователя,
Если выше порогового, то повысить уровень на один, а у пользователя вычесть пороговое значение опыта.

Код, который я написал, он оказался нерабочим. К ChatGPT не отправляйте, он использует старую версию MongoDB - 4.2. В версии 5.2 метод save() является устаревшим и нерабочим.

Код:
spoiler
let users = await await acc.find({});
users.forEach(async user => {
    const requiredExperience = levelCurve[user.level];
    if (user.exp >= requiredExperience) {
        user.level += 1;
        user.exp -= requiredExperience;
        await acc.insert(user);
    }
});
  • Вопрос задан
  • 81 просмотр
Подписаться 1 Простой 12 комментариев
Решения вопроса 1
@ligedark_general Автор вопроса
Программист. Другие IT услуги
Крч, я послушал всех, но временно сделал по-своему. Спасибо всем за помощь.

Решил данный вопрос гениально просто:
spoiler
let users = await await acc.find({});
    users.forEach(async user => {
    const requiredExperience = levelCurve[user.level];
         if (user.exp >= requiredExperience) {
              wait acc.updateOne({ _id: user._id}, { $inc: { level: 1, exp: -(requiredExperience)}});
          }
     });


UPD: Больше таким не страдаю. Если и проверять опыт, то сразу же при начислении. Так максимально сокращается кол-во запросов к бд.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы