VersionError:找不到匹配的文档只在(Mocha)测试中发现错误

时间:2014-10-24 18:56:34

标签: node.js mongoose mocha bluebird

我已经阅读了人们使用版本密钥时遇到的其他问题/答案,但由于某种原因,我不明白为什么这种情况会在我的情况下发生。

所以我有以下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:找不到匹配的文档。

我真的不明白为什么会发生这种情况,因为我已经第一次推送到阵列而没有版本问题。为什么连续第二次失败?

1 个答案:

答案 0 :(得分:1)

Mongoose versionKey在文档上保存版本号,通常名为__v

只要对数组的修改可能会更改任何数组的元素位置,此值就会以原子方式递增。对于需要使用位置表示法的任何更新,此值也会在where子句中发送。如果我们的where子句仍然匹配文档,它确保没有其他操作改变了我们的数组元素位置,并且可以使用使用位置语法。 (read more here

在您的测试中,在第一次save()之后,该文档的增加__v,应该在您的文档上更新,以便作为第二where clause的一部分由mongoose使用{1}}。