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

dfuffjeb  于 2023-03-30  发布在  Go
关注(0)|答案(5)|浏览(203)

我正在尝试切换和更新数据库中的布尔值,每当一个按钮被点击..
我的HTML:

<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 is undefined)
我是快递和 Mongoose 的新手,在谷歌上搜索了很多,但找不到解决方案。请帮助。还有其他方法可以解决这个问题吗?

htzpubme

htzpubme1#

您使用的方法将不起作用。您在此片段中引用了undeclared变量sold{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. }

krcsximq

krcsximq2#

您可以通过以下方便的方式更新文档:

Book.findOne({ _id: req.params.id }, function(err, book) {
    book.sold = !book.sold;
    book.save(function(err, updatedBook) {
        ...
    });
});
3j86kqsm

3j86kqsm3#

遗憾的是,没有办法在一次操作中直接反转一个记录--如果你只想对布尔值进行操作,你需要像Austin说的那样找到、改变,然后再次保存。
如果你可以稍微改变你的数据,我们实际上可以用整数来近似。如果我们使用整数,我们可以使用按位操作来做到这一点,例如。

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

在这种情况下,您的Mongoose模型必须指定myBoolVal为整数。这需要Int32包,截至此答案:Mongoose ODM: NumberInt is not defined。例如:

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

zbsbpyhn4#

你可以根据$mod判断奇数和偶数
$mod:[2,0] $mod:[二、一]
var bookSchema = new mongoose.Schema({ title:字符串,说明:字符串,已售出:{类型:编号,默认值:} });
BookSchema.findOneAndUpdate({_id:req.params.id},{$inc:{sold:1}});
req.params.id,sold:{$mod:[2,0]}})

qxsslcnc

qxsslcnc5#

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

其他依赖性:

  • 方法覆盖。
  • 正文解析器。

相关问题