Мангуст уменьшает одно из двух значений

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #мангуст

Вопрос:

У меня есть схема пользователя с двумя полями:

 var userSchema = mongoose.Schema({
    credits : { type: Number },
    energy: { type: Number },
});
  

То, что я пытаюсь сделать, это уменьшить одно из значений в зависимости от другого.

Если есть какие-либо кредиты, уменьшите их на 1, в противном случае уменьшите энергию на 1.

Одно простое решение:

 const user = await User.findById("123");
if (user.credits > 0) {
  user.credits = model.credits - 1;
} else {
  user.energy = user.energy - 1;
}
await user.save();
  

Однако я предполагаю, что это небезопасно для параллелизма.

Поэтому я предполагаю, что мне нужно будет сделать что-то вроде:

 await user.update({_id: userId}, { $inc: { energy: -1 } })
  

Но есть ли какой-нибудь способ проверить, что нужно уменьшить в запросе обновления или другом хорошем решении?

Комментарии:

1. попробуйте $cond

2. Похоже, что $cond находится только в операции агрегирования, поэтому не обновляет запросы. Так что не уверен, смогу ли я это использовать.

Ответ №1:

Я думаю, что нашел одно решение, но не уверен, что оно лучшее.

 const res = await UserModel.updateOne(
  { _id: id, coins: { $gt: 0 } }, // Matches if coins are positive
  { $inc: { coins: -1 } }, // If it's the case decrement coins
);

// If none was modified, coins must be 0,
// so we decrement energy instead
if (!res.nModified) {
  await UserModel.updateOne(
    { _id: id, energy: { $gt: 0 } }, // Make sure energy never goes negative
    { $inc: { energy: -1 } },
  );
}