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

时间:2016-07-14 19:36:36

标签: javascript node.js mongodb express mongoose

我试图在点击按钮时切换并更新数据库中的布尔值。
我的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){
....
}

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

我是新来表达和猫鼬,并在谷歌上搜索了很多,但无法找到解决方案。请帮忙。 有没有其他方法可以解决这个问题?

4 个答案:

答案 0 :(得分:4)

您使用的方法无效。您在此片段中引用undeclared变量sold{sold: !sold}。如果有的话,您需要{sold: !this.sold},但this中的findById是查询,而不是模型。您必须使用findById作为所需的图书,手动更新(book.sold = !book.sold),然后save

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

看起来像

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

答案 1 :(得分:2)

您只需以这种方便的方式更新文档:

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

答案 2 :(得分:1)

很遗憾没有办法在一次操作中直接反转记录 - 如果你只想操作布尔,你需要找到,变异,然后再按照奥斯汀所说的那样保存。

如果您可以略微更改数据,我们实际上可以使用整数来近似。如果我们使用整数,我们可以使用按位运算来执行此操作,例如

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

答案 3 :(得分:-1)

<function model="ir.actions.report" name="unlink_action">
    <value eval="[ref('sale.action_report_saleorder')]"/>
</function>

<function model="ir.actions.server" name="unlink_action">
    <value eval="[ref('sale.model_sale_order_action_share')]"/>
</function>

这是我使用express,猫鼬和nodejs的示例。

这是我的模型的一个例子:

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("/")
      }
    })
  })
});

其他依赖项:

  • 方法重写。
  • Body Parser。