在循环中发出异步请求以从嵌入集合中删除文档:
_.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
并查看所有简历的_id
之后,我试图通过id查找的文档存在于集合中。
- 请在此查找:**
{ title: 'gggff', _id: 530e57a7503d421eb8daca65 }
输入:
[{ title: 'asddas', _id: 530e57a7503d421eb8daca61 }
{ title: 'gggff', _id: 530e57a7503d421eb8daca65 }
{ title: 'ewrs', _id: 530e57a7503d421eb8daca64 }]
我假设这与我异步执行这些请求的事实有关,或者存在版本控制问题,但我不知道如何解决它。
当我记录resumes
时,我怎么能看到我试图找到的resume
,这对我来说没有任何意义,但是如果我记录:
log(account.resumes.id(id));
我得到undefined
。
更新
我发现我的问题在于版本控制。
http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html
但是我仍然不确定如何在不禁用版本控制的情况下解决这个问题,我不想禁用版本控制。
2条答案
按热度按时间yruzcnhs1#
在mongodb版本3中,文档现在有了一个increment()方法,它可以手动强制文档版本递增。每当对数组的操作可能改变数组元素的位置时,也会在内部使用这个方法。这些操作包括:
更改版本密钥
通过将versionKey选项传递给Schema构造函数,可以自定义版本密钥:
或者直接设定选项:
禁用
如果您不想在模式中使用版本控制,可以通过为versionKey选项传递false来禁用它。
e4yzc0pl2#
MongooseJs API文档明确警告禁用版本控制,并建议不要这样做。您的问题是由于工作流。如果您正在从UI更新集合,发送API请求,而不是用后端的对象刷新对象--然后尝试再次更新,您将遇到您报告的错误。我建议您从API响应中使用/更新对象范围,则__v会正确递增。或者在PUT API请求中不发送__v字段,这样就不会与数据库中集合的版本冲突。
另一个选择是--当从后端请求对象时,让API响应不发送__v字段,这样你就不必编写逻辑来不从前端发送它。在所有对该集合的获取中,执行以下任一操作(取决于你如何编写查询):
或