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

时间:2014-02-26 21:26:31

标签: 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) {
    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

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

2 个答案:

答案 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);
});