我已经阅读了人们使用版本密钥时遇到的其他问题/答案,但由于某种原因,我不明白为什么这种情况会在我的情况下发生。
所以我有以下mocha测试:
it('should be able to save one job', function (done) {
Promise.join(user.saveAsync(), company.saveAsync(),
function (savedUser, savedCompany) {
user = savedUser[0];
user.jobs.push(job);
user.saveAsync()
.spread(function (savedUserWithJob) {
user = savedUserWithJob;
user.jobs.should.have.length(1);
done();
})
.catch(function (err) {
done(err);
});
});
});
这一切都很好并通过。即使在运行时我也没有任何其他问题。
现在,当我尝试在第一个测试之后再次运行相同的测试时,即:
it('should be able to save one job', function (done) {
.....
});
it('should be able to save one job again', function (done) {
.....
});
第二个失败并出现错误:
VersionError:找不到匹配的文档。
我真的不明白为什么会发生这种情况,因为我已经第一次推送到阵列而没有版本问题。为什么连续第二次失败?
答案 0 :(得分:1)
Mongoose versionKey在文档上保存版本号,通常名为__v
。
只要对数组的修改可能会更改任何数组的元素位置,此值就会以原子方式递增。对于需要使用位置表示法的任何更新,此值也会在where子句中发送。如果我们的where子句仍然匹配文档,它确保没有其他操作改变了我们的数组元素位置,并且可以使用使用位置语法。 (read more here)
在您的测试中,在第一次save()
之后,该文档的增加__v
,应该在您的文档上更新,以便作为第二where clause
的一部分由mongoose使用{1}}。