Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose __v when does it change

According to http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning The version field __v is suppose to change when array elements are shifted out of their original position.

I run a test code (Mongoose version 3.8.15):

var mongoose = require('mongoose');

var db = mongoose.connection;
mongoose.connect('mongodb://localhost:27017/node_test');
db.on('error', console.error.bind(console, 'connection error:'));

var testSchema = mongoose.Schema({
  name: String,
  arr: [Number]
})
var Test = mongoose.model('Test', testSchema);

var t = Test();
t.name = 'hi'
t.arr = [1, 2, 3, 4, 5, 6];
t.save(function (err, result) {
  console.log(result)
  Test.update({'name': 'hi'}, {$pull: {'arr': 3}}, function(err2, result2) {
    console.log(result2)
    Test.find({'name': 'hi'}, function(err3, result3) {
      console.log(result3);
      db.close();
    });
  });
});

Output:

{ __v: 0,
  name: 'hi',
  _id: 53f594a0113832871c2eea89,
  arr: [ 1, 2, 3, 4, 5, 6 ] }
1
[ { _id: 53f594a0113832871c2eea89,
    name: 'hi',
    __v: 0,
    arr: [ 1, 2, 4, 5, 6 ] } ]

So, number 3 is removed which introduced a disruptive change to the array if any code is to attempt to access it by the position of its index. Why isn't the version incremented?

like image 382
huggie Avatar asked Aug 21 '14 06:08

huggie


1 Answers

The author of the article wasn't very clear when the version increment will be internally applied, because as you found out the version field is not updated when you're using the update command.

If you replace the update command with Mongoose pull method on your array the version field will be incremented:

var t = Test();
t.name = 'hi'
t.arr = [1, 2, 3, 4, 5, 6];

t.save(function (err, result) {
    console.log(result);

    // use Mongoose pull method on the array
    t.arr.pull(3);

    t.save(function(err2, result2) {
        console.log(result2)
    });
});

Results:

{ __v: 0,
  name: 'hi',
  _id: 53f59d2a6522edb12114b98c,
  arr: [ 1, 2, 3, 4, 5, 6 ] }
{ __v: 1,
  name: 'hi',
  _id: 53f59d2a6522edb12114b98c,
  arr: [ 1, 2, 4, 5, 6 ] }

Edit:

The update method on the model basically only builds and executes the query. The version checking / incrementing is done when you use the save method

like image 52
Christian P Avatar answered Oct 06 '22 16:10

Christian P