猫鼬/ mongodb - 原子发现

时间:2015-01-30 19:07:46

标签: node.js mongodb mongoose

这更像是"嘿,这就是mongoose / mongodb的工作方式"反对我该怎么做?

让我指出:

Model.find({name:'jim'}, function(err, jim){
    // i should happen first & find 0 jim's 
    new Model({name:'jim'}).save( ... );
});

Model.find({name:'jim'}, function(err, jim){
    // i should happen second & find 1 jim 
    new Model({name:'jim'}).save( ... );
});

我希望查找内部的所有内容都可以保留以后对该模型的任何插入,直到保存新模型。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

the mongoose documentation

很好地涵盖了这一点

更像是:

Model.findOne({name:"jim"}, function(err, jim) {
  if (err) return handleError(err);

  jim.newField = "new value";
  jim.save(function (err) {
    if (err) return handleError(err);
    res.send(jim);
  });
});

它不是原子的,因为你会发现'jim',然后在执行回调函数期间,'jim'文档可能会从一些不同的客户端操作中改变。

我链接的文档提供了更新原子文档的其他方法。

从评论中提及的答案中获得答案:

... data.locked = true;
Model.findOneAndUpdate(query, data, {upsert:true}, function(err, doc){...} );
// in your callback function - you can query against models w/ that 
// locked attribute being true 
//- if your logic is true keep&update record , else **remove**