如何在Node.js中使用mongoose进行原子查找和保存

如何在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

在我的数据库中,我有一个“Thing”,其id是“53e5fec1bcb589c92f6f38dd”。
每次调用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