【问题标题】:Mongoose findByIdAndUpdate method to toggle and update a Boolean value in databaseMongoose findByIdAndUpdate 方法来切换和更新数据库中的布尔值
【发布时间】:2016-07-14 19:36:36
【问题描述】:

每当单击按钮时,我都会尝试切换和更新数据库中的布尔值。
我的 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){
....
}

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

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

【问题讨论】:

  • 你能说明你是如何以及在哪里声明出售变量的吗,这可能是一个范围问题。
  • @rresol 实际上我没有在任何地方声明它......我虽然它会切换数据库中的销售价值。才意识到我错了。有没有办法引用数据库中已经存在的值?
  • 你到底想做什么?
  • @rresol 当用户点击按钮时,已售出变为真,再次点击时,已售出变为假..等等
  • 当按钮被单击时,它必须发出一些信号或一些请求,并且由于您只想在单击按钮时更新已售出,添加一个回调,如果事件发生将被调用并在 $set 中传递 {sold: true}。

标签: javascript node.js mongodb express mongoose


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      遗憾的是,没有办法在单个操作中直接反转记录 - 如果您只想对布尔值进行操作,您需要像 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}
      });
      

      【讨论】:

        【解决方案4】:
        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);
        

        其他依赖:

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

        【讨论】:

          猜你喜欢
          • 2020-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-30
          • 1970-01-01
          • 1970-01-01
          • 2017-05-30
          • 2013-05-27
          相关资源
          最近更新 更多