I'm working with a mongoDB database and I want to toggle the boolean present attribute inside the Day object. Here is my working code:
exports.modifyPresence = (req, res) => {
action.getStudentCurrentDay(req.body.hash)
.then(
dayId => {
return Day.findOne({_id: dayId});
}
)
.then(
day => {
return Day.findOneAndUpdate({_id: day.id},{$set:{present:!day.present}});
}
)
.then(
() => res.status(200).json("This is a success")
)
.catch(
(error) => res.status(500).json({error})
)
}
It's working but I would have loved to call my db once and write something like this:
exports.modifyPresence = (req, res) => {
action.getStudentCurrentDay(req.body.hash)
.then(
dayId => {
return Day.findOneAndUpdate({_id: day.id},{$set:{present:!present}});
}
)
.then(
() => res.status(200).json("This is a success")
)
.catch(
(error) => res.status(500).json({error})
)
}
Do anyone knows how to implement a single call to the database and toggle my boolean in an elegant way? I have no clues how to simplify my code.
Thank you all
If you are using MongoDB 4.2, you can use aggregation operators in your update statement, like:
.findOneAndUpdate({_id: day.id},[{$set:{present:{$eq:[false,"$present"]}}}]);
That will set present to true if it is false, and to false if it is any other value.
You can use update with aggregation pipeline starting from MongoDB v4.2,
$not returns false; when passed an expression that evaluates to false, $not returns true.return Day.findOneAndUpdate(
{ _id: day.id },
[
{ $set: { present: { $not: "$present" } } }
]
);
Playground
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With