使用 mongoDB 切换布尔值

Oli*_*ona 6 optimization boolean toggle mongodb

我正在使用 mongoDB 数据库,我想切换 Day 对象内的布尔值present 属性。这是我的工作代码:

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})
  )
}
Run Code Online (Sandbox Code Playgroud)

它正在工作,但我很想打电话给我的数据库一次并编写如下内容:

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})
  )
}
Run Code Online (Sandbox Code Playgroud)

有谁知道如何实现对数据库的单个调用并以优雅的方式切换我的布尔值?我不知道如何简化我的代码。

谢谢你们

Joe*_*Joe 10

如果您使用的是 MongoDB 4.2,则可以在更新语句中使用聚合运算符,例如:

.findOneAndUpdate({_id: day.id},[{$set:{present:{$eq:[false,"$present"]}}}]);
Run Code Online (Sandbox Code Playgroud)

present如果为 false,则设置为 true;如果为任何其他值,则设置为 false。


tur*_*hal 7

从 MongoDB v4.2 开始,您可以将更新与聚合管道一起使用,

  • $not评估布尔值并返回相反的布尔值;即当传递一个计算结果为 true 的表达式时,$not返回 false;当传递一个计算结果为 false 的表达式时,$not返回 true。
return Day.findOneAndUpdate(
  { _id: day.id },
  [
    { $set: { present: { $not: "$present" } } }
  ]
);
Run Code Online (Sandbox Code Playgroud)

操场

  • 如果“present”字段不包含布尔值,这也具有不修改它的效果。我不知道提问者的意图是什么。 (3认同)