Mongoose findByIdAndUpdate 方法,用于切换和更新数据库中的布尔值

Mongoose findByIdAndUpdate method to toggle and update a Boolean value in database

本文关键字:数据库 更新 布尔值 方法 findByIdAndUpdate 用于 Mongoose      更新时间:2023-09-26

每当单击按钮时,我都试图切换和更新数据库中的布尔值。
我的网页:

<form action="/browse/<%= book._id %>/sold" method="GET">
   <button type="submit"> Mark As Sold </button>
</form>

图式:

var bookSchema = new mongoose.Schema({
  title: String,
  description: String,
  sold: { type:Boolean, default: false }
});

我尝试在 .get 路由上使用它:

Book.findByIdAndUpdate(req.params.id, {$set: {sold: !sold} }, function(err, book){
....
}

但它不起作用..(已售出未定义)

我是快递和猫鼬的新手,在谷歌上搜索了很多,但找不到解决方案。请帮忙。还有其他方法可以解决这个问题吗?

您正在使用的方法将不起作用。您正在引用此截图中sold undeclared变量:{sold: !sold} 。如果有的话,你会想做{sold: !this.sold},但findById中的this是查询而不是模型。您必须对您想要的书使用findById,手动更新它(book.sold = !book.sold),然后save它。

您可以在模型上创建一个静态方法来完成所有这些操作。

它看起来像

bookSchema.statics.findByIdAndToggleSold = function(id, callback){ // Your code to find, then update here. }

你可以用这种方便的方式更新文档:

Book.findOne({ _id: req.params.id }, function(err, book) {
    book.sold = !book.sold;
    book.save(function(err, updatedBook) {
        ...
    });
});
遗憾的是,

没有办法在单个操作中直接反转记录 - 如果你想只对布尔值进行操作,你需要找到,变异,然后再次保存,正如奥斯汀所说。

如果你能稍微改变你的数据,我们实际上可以使用整数来近似这个数字。如果我们使用整数,我们可以使用按位运算来做到这一点,例如

Book.insert({myBoolVal: 0}); // Insert as false
Book.findAndUpdate(req.params.id, {$bit: {myBoolVal: {xor: 1}}}); // 0 xor 1 = 1; 1 xor 1 = 0
Book.find({myBoolVal: 0}); // false
Book.find({myBoolVal: 1}); // true

在这种情况下,猫鼬模型必须myBoolVal指定为整数。这需要Int32包,截至此答案:猫鼬ODM:未定义NumberInt。例如:

var NumberInt = require("mongoose-int32");
var bookSchema = new mongoose.Schema({
  title: String,
  description: String,
  sold: { NumberInt, default: 0}
});

您可以基于$mod判断奇数和偶数

$mod : [2,0]
$mod : [2,1]
var bookSchema = new mongoose.Schema({
  title: String,
  description: String,
  sold: { type:Number, default: 0 }
});
bookSchema.findOneAndUpdate({_id:req.params.id},{$inc:{sold: 1}});
bookSchema.findOne({_id:req.params.id, sold:{$mod : [2,0]}})
app.put("/todo/update/:id", function (req, res) {
  Todo.findById(req.params.id, function (err, todo) {
    todo.done = !todo.done;
    todo.save(function (err, updatedTodo) {
      if (err) {
        console.log(err);
      } else {
        res.redirect("/")
      }
    })
  })
});

这是我使用 express、mongoose 和 nodejs 的一个例子。

这是我的模型示例:

const todoSchema = new mongoose.Schema({
  text: {
    type: String,
    required: true
  },
  done: {
    type: Boolean,
    default: false
  }
});
const Todo = mongoose.model('Todo', todoSchema);

其他依赖关系:

  • 方法重写。
  • 正文解析器。