我正在使用Sails中的Web应用程序,我在其中使用Waterline操作数据库。假设我想增加数据库中特定单元的字段,例如某个用户的viewsNo,我目前这样做:
User.findOne(userId, function foundUsr(err, user) {
// ..handle error stuff..
User.update(userId, {viewsNo: user.viewsNo + 1}, function (err, usr) {
// ..rest of the code..
})
});
是否可以通过一次调用处理这两个数据库操作?除了数据库加载,它还将提高代码清晰度,但我无法找到解决方案。
答案 0 :(得分:3)
是的@ Vee6如你所述,使用User.native()将起作用,另一种选择是:
User.findOne(userId, function foundUsr(err, user) {
user.viewsNo++;
user.save(function(err) { /* updated user */ });
});
答案 1 :(得分:0)
如果我正确地解决了您的问题,则需要进行第一次查询,以检查数据库中是否存在具有给定userId的记录。在这种情况下,您应该将beforeUpdate()方法添加到模型中。
类似的东西:
// api/models/user.js
module.exports = {
attributes: {/* ... */},
beforeUpdate: function(values, next) {
User.findOne(values.userId).exec(function(err, user) {
// ..handle error stuff..
if (err) return next(err);
if (typeof user === 'undefined') return next(new Error('bad userId'));
next();
});
}
};
现在你可以在控制器中更新你的值,如果发生错误,sails将停止更新。
UPD:关于在单个查询中递增viewsNo
:目前不可能。这是关于它的feature request。