Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Toggle a boolean value with mongoDB

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

like image 600
Olivier D'Ancona Avatar asked Jul 12 '26 12:07

Olivier D'Ancona


2 Answers

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.

like image 115
Joe Avatar answered Jul 14 '26 17:07

Joe


You can use update with aggregation pipeline starting from MongoDB v4.2,

  • $not Evaluates a boolean and returns the opposite boolean value; i.e. when passed an expression that evaluates to true, $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

like image 21
turivishal Avatar answered Jul 14 '26 17:07

turivishal



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!