mongoose: Version Error: no matching doc found

I have an issue - not sure if I am doing something wrong or it’s a bug. I have some products - each of these has an array of variations. I want to go through some data and load it in these variations but I experience a number of ‘VersionError: No matching document found’ errors.

Thinking I was having a race condition (I am sequentially saving the same document for each of its variations that I modify) I used asyc.eachSeries() but that did not help. Loading the error causing documents one at the time does not yield the error so it seems related to some race condition but I cannot track it down.

Schema:

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

Sample code:

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

About this issue

  • Original URL
  • State: closed
  • Created 11 years ago
  • Comments: 21 (2 by maintainers)

Most upvoted comments

Hi! I have some problem too! I noticed that usage of logging modifiedPaths leads to different output data.

First saving: [‘Groups’]

More saving: [‘ModifiedAt’, ‘__v’, ‘groups’]

Perhaps the problem is that the new requires do not use current version __v field (they use remaining in “client” memory).

SOLVED I deleted version property from requests for update. delete req.body.__v;

@dciccale after taking a closer look at your code, yep, that’s expected behavior and a classic example of how versioning is expected to work - overwriting an array when the array changed underneath you is a version error. You can disable versioning or use the skipVersioning to selectively skip a field for versioning if you’re sure you’re not worried about conflicting changes.