假设我有一个文档,例如:var doc = Model.findOne({name:“name”});
现在,如果文档通过数据库的另一个连接进行编辑,则doc不会保留正确的信息。我确实需要它,所以我必须从数据库中“刷新”或“重新下载”它。有没有办法只用对象“doc”来做这个?
答案 0 :(得分:3)
假设doc
包含要刷新的文档实例,您可以执行此操作以通常刷新它:
doc.model(doc.constructor.modelName).findOne({_id: doc._id},
function(err, newDoc) {
if (!err) {
doc = newDoc;
}
}
);
但是,最好不要将Mongoose文档实例持久存储/缓存超出您对它们的直接需求。缓存您需要快速访问的不可变_id
个文档,而不是文档本身。
答案 1 :(得分:1)
对不起,我知道这已经过时了,但我有一个更好的解决方案,万一其他人还在四处寻找。
在这种并发访问同一文档的情况下,您可以执行正常保存。
Mongoose使用对象的__v属性来确保旧实例不会覆盖最新实例。
因此,如果您有2个doc .__ v = 0的实例,并且A首先保存,则db现在具有doc .__ v = 1.因此,当B保存时,它将是错误并且因为B .__ v = 0,所以1.那么你可以做的就是捕获错误(它应该是一个特定的猫鼬错误)并通过刷新对象来处理它(它应该将其提升到__v = 1)然后保存它或不保存它取决于你想做什么。
所以在代码中
doc.save(function (err, _doc) {
if (err) {
if (err.some_error_property_telling_you_version_was_wrong) {
// Do your business here
// Refresh your object
// Model.findById(doc._id, function (err, _refreshed_doc) {});
// doc = _refreshed_doc;
// doc.set('property', value); set the value again
// Then re-save? or maybe make this a recursive function,
// so it can keep trying to save the object?
} else {
// Handle it like a normal error
}
}
});
答案 2 :(得分:0)
如果它是用 let
定义的,你就可以了
await thing.update(stuff);
thing = await Thing.findById(thing._id);
或者如果它与 const
一起使用,则一成不变:
await thing.update(stuff);
const updatedThing = await Thing.findById(thing._id);