【问题标题】:Version error on saving Mongoose docs保存 Mongoose 文档时出现版本错误
【发布时间】:2014-01-10 11:42:05
【问题描述】:

我有一个问题 - 不知道是我做错了什么还是错误。我有一些产品——每一个都有一系列的变化。我想浏览一些数据并将其加载到这些变体中,但我遇到了一些“版本错误:未找到匹配的文档”错误。

认为我遇到了竞争条件(我为我修改的每个变体顺序保存相同的文档)我使用了 asyc.eachSeries() 但这没有帮助。一次加载导致错误的文档不会产生错误,因此它似乎与某些竞争条件有关,但我无法追踪它。

架构:

var Product = new Schema({
  title: {
    type: String,
  },  
  variations: {
    type: Array
  }
});

示例代码:

// Some data to load - the 'variant' is the index of the variations array above
var records = [{
  code: 'foo',
  id: '50ba9c647abe1789f7000073',
  variant: 0
}, {
  code: 'bar',
  id: '50ba9c647abe1789f7000073',
  variant: 1
}, {
  code: 'foobar',
  id: '50ba9c647abe1789f7000073',
  variant: 2
}];

var iterator = function(item, cb) {
  Product.findById(item.id).exec(function(err, product) {
    if(err) {
      return cb(err);
    }
    if (product) {
      product.variations[item.variant].code = item.code.trim();
      product.markModified('variations');
      product.save(function(err, p) {
        return cb(err);
      });
    } else {
      return cb('Missing product');
    }
  });
};

async.eachSeries(records, iterator, function(err) {
  process.exit(1);
});

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    我认为问题在于您如何定义架构。拥有变体是它自己的架构并让产品架构将其用作子文档会更好。我会将其更改为如下所示:

    var Variant = new Schema({
        code: String,
    })
    
    var Product = new Schema({
        title: String,
        variants: [Variant]
    })
    

    然后你可以像这样浏览记录:

    var variants = product.variants
    for (i in variants) {
        var variant = variants[i]
        variant.code = records[i].code
        variant.save(function(err) {
            ...
        })
    }
    

    【讨论】:

    • 似乎没有任何区别。
    • 上面列出的:VersionError:找不到匹配的文档
    • Hmm.. 如果您将同一个对象保存在两个不同的异步回调中,这可能是导致此错误的原因。您是否多次为同一产品调用迭代器方法?那么product.save(function(err, p) { ... } 可能是它的原因。尝试运行一次代码,看看是否仍然出现错误。
    • 我认为这确实是一个双重保存问题 - 我修改了代码以加载一次对象,更新所有变体并保存并且有效。但是为什么 async.eachSeries 不起作用?也许我没有正确使用它。我可能会改写这个问题
    • @materik 你先生让我头疼不已。
    【解决方案2】:

    如果在模型Scheme中你使用versionKey,当从mongo多次调用doc时,问题可能会出现,在这种情况下,最好的方法是发送doc的所有对象,靠近示例

    function getDoc(doc, callback) {
        if ( doc instanceof Object && doc._id ) {
            callback(null, doc);
        } else {
            return Doc.findById(doc, callback);
        }
    }
    
    function updateDoc(doc, data) {
       // doc is already model
       getDoc(doc, function(err, doc) {
           doc.data = data;
           doc.save();
       });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 2018-12-22
      • 2017-10-06
      相关资源
      最近更新 更多