Mongodb Mongoose使用id()方法未找到匹配的文档。异步删除请求导致的错误

Mongodb Mongoose使用id()方法未找到匹配的文档。异步删除请求导致的错误,mongodb,mongoose,Mongodb,Mongoose,在循环中发出异步请求以从嵌入集合中删除文档: _.each deletedItem, (item) -> item.$delete() 不规则地抛出此错误: { message: 'No matching document found.', name: 'VersionError' } 执行时: var resume = account.resumes.id(id); resume.remove(); account.save(function (err, acct) {

在循环中发出异步请求以从嵌入集合中删除文档:

_.each deletedItem, (item) ->
     item.$delete()
不规则地抛出此错误:

{ message: 'No matching document found.', name: 'VersionError' }
执行时:

var resume = account.resumes.id(id);

resume.remove();

account.save(function (err, acct) {
    console.log(err);
    if(err) return next(err);
    res.send(resume);
});
在记录
account.resumes
并查看所有简历的
\u id
后,我试图按id查找的文档存在于该集合中。

530e57a7503d421eb8daca65 查找:

{ title: 'gggff', _id: 530e57a7503d421eb8daca65 }
[{ title: 'asddas', _id: 530e57a7503d421eb8daca61 }
{ title: 'gggff', _id: 530e57a7503d421eb8daca65 }
{ title: 'ewrs', _id: 530e57a7503d421eb8daca64 }]
输入:

{ title: 'gggff', _id: 530e57a7503d421eb8daca65 }
[{ title: 'asddas', _id: 530e57a7503d421eb8daca61 }
{ title: 'gggff', _id: 530e57a7503d421eb8daca65 }
{ title: 'ewrs', _id: 530e57a7503d421eb8daca64 }]
我假设这与我异步执行这些请求或者存在版本控制问题有关,但我不知道如何解决它

当我记录
resume
时,我如何能看到我试图查找的
resume
对我来说没有任何意义,但是如果我记录:

log(account.resumes.id(id));
我得到未定义的

更新

我发现我的问题在于版本控制


但我仍然不确定如何在不禁用版本控制的情况下解决此问题,我不想这样做。

在mongodb版本3中,文档现在有一个increment()方法,手动强制文档版本递增。每当数组上的操作可能改变数组元素位置时,也会在内部使用此选项。这些行动是:

$pull $pullAll $pop $set of an entire array
更改版本密钥

通过将versionKey选项传递给架构构造函数,可以自定义版本密钥:

new Schema({ .. }, { versionKey: 'myVersionKey' });
或者直接设置选项:

schema.set('versionKey', 'myVersionKey');
禁用

如果不想在模式中使用版本控制,可以通过为versionKey选项传递false来禁用它

schema.set('versionKey', false);

MongooseJs API文档明确警告禁用版本控制,并建议不要这样做。您的问题是由工作流引起的。如果您正在从UI更新集合,发送API请求,但没有从后端使用对象刷新对象——然后再次尝试更新它,您将遇到报告的错误。我建议使用/更新API响应中的对象范围,然后正确地增加_v。或者不要在PUT API请求上发送_v字段,这样它就不会与数据库中集合的版本冲突

另一个选项是——当从后端请求对象时,让API响应不发送__v字段,这样您就不必编写逻辑代码不从前端发送它。在该集合的所有GET上,执行以下任一操作(取决于如何编写查询):