Mongoose findByIdAndUpdate 方法,用于切换和更新数据库中的布尔值
Mongoose findByIdAndUpdate method to toggle and update a Boolean value in database
每当单击按钮时,我都试图切换和更新数据库中的布尔值。
我的网页:
<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);
其他依赖关系:
- 方法重写。
- 正文解析器。
- 如何在执行 Ajax 请求大量数据库更新时实现进度条
- 用sql数据库更新谷歌地图标记
- 数据库更新后刷新数据表
- 通知浏览器数据库更新的最佳方法
- AJAX 数据库更新
- 数据库更新的用户确认 - php + Ajax
- 如何使用 typicode/lowdb 文件数据库更新项目数组
- 如何在数据库更新时向客户端发送警报,如facebook聊天
- 在数据库更新时通过Jquery Ajax跟踪和操纵内容
- 付款处理成功,但数据库更新失败
- AJAX数据库更新与CSS按钮颜色改变使用Codeigniter
- 我怎么能得到一个文本字段的值从数据库更新的形式
- Angular JS从数据库更新视图
- 使用外部数据库更新多个站点上的html和css
- 如何在不重新加载页面的情况下使用数据库更新游戏的最高分?
- 当数据库更新时,web应用程序中的通知
- php/javascript在数据库更新后更改内联标签
- 从远程数据库更新Kendo UI Mobile中的列表视图
- 如何处理Angular控制器中的错误从MongoDB数据库更新/删除在Express
- onclick提交上的数据库更新字段不起作用