#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 } },
);
}