Mongoose递减两个值之一



我有一个包含两个字段的用户模式:

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

但是,有没有任何方法可以检查在更新查询或其他好的解决方案中减少什么?

我想我找到了一个解决方案,但不确定它是否是最好的。

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

最新更新