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

dw1jzc5e  于 2022-11-13  发布在  Go
关注(0)|答案(2)|浏览(140)

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

_.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
但是我仍然不确定如何在不禁用版本控制的情况下解决这个问题,我不想禁用版本控制。

yruzcnhs

yruzcnhs1#

在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);
e4yzc0pl

e4yzc0pl2#

MongooseJs API文档明确警告禁用版本控制,并建议不要这样做。您的问题是由于工作流。如果您正在从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);
});

var model = require('model');
model.find({}, '-__v', function(err,results){
    if(err) res.status(500).send(err);
    if(results) res.status(200).json(results);
});

相关问题