如何在Node.js中使用mongoose进行原子查找和保存
在我的数据库中,我有一个“Thing”,其id是“53e5fec1bcb589c92f6f38dd”。如何在Node.js中使用mongoose进行原子查找和保存,node.js,mongoose,Node.js,Mongoose,在我的数据库中,我有一个“Thing”,其id是“53e5fec1bcb589c92f6f38dd”。 每次调用doAdd时,我都要更新其中的计数成员。 如下面的代码所示。 但是,由于查找和保存操作是分开的,因此无法获得所需的结果。 关于这种情况有什么最佳做法吗? 提前谢谢 var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); var ThingSchema = new mongoos
每次调用doAdd时,我都要更新其中的计数成员。
如下面的代码所示。
但是,由于查找和保存操作是分开的,因此无法获得所需的结果。
关于这种情况有什么最佳做法吗?
提前谢谢
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var ThingSchema = new mongoose.Schema({
count: Number,
});
var Thing = mongoose.model('Thing', ThingSchema);
var doAdd = function(id){
Thing.findById(id, function(err, thing){
if(******){
#perform some logic...
thing.count++;
}
thing.save();
});
};
var id = "53e5fec1bcb589c92f6f38dd";
doAdd(id);
doAdd(id);
问题是,当您两次调用
doAdd
时,您希望将计数增加2。但是这里doAdd
中的代码是异步的,即在第一个查询和保存过程完成之前调用第二个doAdd
调用。由于函数的异步性质,结果是不可预测的。所有mongoose查询和save
调用都是异步的。
所以如果你打电话
thing.save();
console.log('saved!!');
控制台输出在文档实际保存之前出现,因为节点不会等待保存完成。因此,如果您需要在保存文档后执行任何操作,您可以将其放在回调中
thing.save(function(err){
if(!err){
console.log('saved');
}
});
如果要避免回调,请查看
async
模块。期望的结果是什么?@Charminbear thing.count应增加2