在循环中发出异步请求以从嵌入式集合中删除文档:
_.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找到的文档存在于集合中。 < / p>
530e57a7503d421eb8daca65 查找
{ title: 'gggff', _id: 530e57a7503d421eb8daca65 }
IN:
[{ 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
但我仍然不确定如何在不禁用版本控制的情况下解决它,我不想这样做。
答案 0 :(得分:4)
在mongodb版本3中,文档现在有一个increment()方法,它手动强制增加文档版本。每当阵列上的操作可能改变数组元素位置时,也会在内部使用它。这些操作是:
$pull $pullAll $pop $set of an entire array
更改版本密钥
可以通过将versionKey选项传递给Schema构造函数来自定义版本密钥:
new Schema({ .. }, { versionKey: 'myVersionKey' });
或直接设置选项:
schema.set('versionKey', 'myVersionKey');
禁用
如果您不想在架构中使用版本控制,可以通过为versionKey选项传递false来禁用它。
schema.set('versionKey', false);
答案 1 :(得分:0)
MongooseJs API文档明确警告禁用版本控制,并建议不要使用它。您的问题是由于工作流程。如果您要从用户界面更新您的收藏集,发送API请求而不使用后端的对象刷新您的对象 - 然后尝试再次更新它,您将遇到您正在报告的错误。我建议从API响应中消耗/更新对象范围,然后__v正确递增。或者不要在PUT API请求上发送__v字段,这样它就不会与数据库中集合的版本发生冲突。
另一个选择是 - 当从后端请求对象时,让API响应不发送__v字段,这样你就不必编写逻辑代码来不从前端发送它。在您对该集合的所有获取中,执行以下任一操作(取决于您编写查询的方式):
var model = require('model');
var qry = model.find();
qry.select('-__v');
qry.exec(function(err,results){
if(err) res.status(500).send(err);
if(results) res.status(200).json(results);
});
OR
var model = require('model');
model.find({}, '-__v', function(err,results){
if(err) res.status(500).send(err);
if(results) res.status(200).json(results);
});