2014-02-26 23 views
3

使异步请求在循环中从嵌入式集合中删除文件:Mongoose使用id()方法找不到匹配的文档。造成异步错误删除请求

_.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并查看所有t的_id他恢复了,我试图通过id找到的文件存在于集合中。

530e57a7503d421eb8daca65 FIND:

{ 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

UPDATE

我发现,我的问题是与版本控制。

http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html

但我仍然不确定如何解决它没有禁用的版本,这是我不想做的事。

回答

4

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

$pull $pullAll $pop $set of an entire array 

改变版本键

版本关键是通过传递versionKey选项架构构造定制:

new Schema({ .. }, { versionKey: 'myVersionKey' }); 

,或者直接设置选项:

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

disabling

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

schema.set('versionKey', false); 
+0

设置'schema.set( 'versionKey',虚假); '为我工作! – SharpCoder

0

Mongoose文档明确警告不禁用版本控制。您的问题是由于工作流程。如果您要更新您的收藏从UI,发送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); 
});