根据http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning,版本字段__v假定在数组元素移出其原始位置时发生更改。
我运行测试代码(猫鼬版本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();
});
});
});
输出:
{ __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 ] } ]
因此,删除了数字3,如果有任何代码要尝试通过其索引位置访问它,则会对数组造成破坏性变化。为什么版本不增加?
本文的作者不清楚何时在内部应用版本增量,因为您发现使用update命令时版本字段未更新。
如果您在阵列上用Mongoose pull方法替换update命令,则版本字段将增加:
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)
});
});
结果:
{ __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 ] }
编辑:
该模型上的update方法基本上只构建并执行查询。使用save方法时,将完成版本检查/递增
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句