Nodejs异步mongodb保存或更新

时间:2014-12-11 14:54:31

标签: javascript node.js mongodb asynchronous mongoose

所以我创建了一个REST API,当有人调用方法返回数据时,我从外部API获取数据,检查数据的ID是否已经存在,如果存在,请更新它,以及如果没有创建它。

问题是,如果另一个请求进入同一资源,我的函数会查找数据,并发现它(尚未)存在,但是当它进入保存时调用时,上一个函数的保存已完成,因此保存失败(某些字段必须是唯一的)。

我目前使用nodejs async和单个worker设置队列。这有效,但我认为它确实会导致性能问题!

有没有人知道我怎么能以不会导致性能问题的方式做到这一点?

var storeData = function(APIResponse, id, callback){

  Record.findOne({ id: id }, function(err, data) {

    if(data === null) {
      //No record, so lets create one

      var data = {};
      data.id = id;
      data.title = APIResponse.title;

      var dataToSave = new Record(data);

    } else {
      //data exists in store, lets update it

      data.title = APIResponse.title; //Update title
      var dataToSave = data;

    }

    dataToSave.save(function(err, doc) {
      if(err) {throw err;}

      //A callback to continue with some other processes
      callback(null, APIResponse, doc);

    });
  });

};

任何想法/建议都会非常感激,非常感谢

1 个答案:

答案 0 :(得分:1)

为什么不只是upsert

var storeData = function(APIResponse, id, callback) {
  var record = {
    id: id,
    title: APIResponse.title
  };

  Record.findOneAndUpdate({ id: id }, record, { upsert: true }, function(err, doc) {
      if(err) { throw err; }
      callback(null, APIResponse, doc);
  });
};