【问题标题】:Nodejs asynchronous mongodb save or updateNodejs异步mongodb保存或更新
【发布时间】:2015-02-10 02:32:45
【问题描述】:

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

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

我目前使用 nodejs async 和单个工作人员设置了一个队列。这可行,但我认为它确实会导致性能问题!

有谁知道我可以如何以不会导致性能问题的方式做到这一点?

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);

    });
  });

};

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

【问题讨论】:

  • 在您的 REST 调用中,如果您假设数据创建,您会将什么传递给 id
  • 从字面上看是资源的唯一 ID。 (例如 10191)。这个想法是数据被缓存以备后用
  • 但是如果你正在创建一个新项目,你怎么知道 ID 呢?你在那里传递 null 或一些特殊的字符串或什么?它总是一个 ID 吗?
  • REST 调用将始终附加一个 ID。所以用户可以搜索这个资源,当他们选择它时,调用将包含从外部 API 获取的 ID。 (我知道 ID,因为我是从事先发生的外部 API 调用中获取的。)
  • 啊,明白了。你看过这个答案吗? stackoverflow.com/a/16362833/970721

标签: javascript node.js mongodb asynchronous mongoose


【解决方案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);
  });
};

【讨论】:

  • 谢谢蒂莫西,这就是我最终的目标!
猜你喜欢
  • 2014-05-21
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
相关资源
最近更新 更多