Mongoosejs如何刷新文档

12
假设我有一个文档,例如:var doc = Model.findOne({name:"name"});
如果该文档在另一个连接上被编辑,则doc将不包含正确的信息。 我需要它,所以我必须从数据库中“刷新”或“重新下载”它。 是否有任何方法仅使用对象“doc”来实现这一点?

如果您想要更新当前对象,那么可以使用findAndModify命令。您有什么需求? - muruga
假设我有两个运行中的服务器,它们不断地修改数据库并需要最新的信息,但它们只有文档。 - urban
好的,如果我正确理解了你的需求,如果你只需要更新文档,那么你必须使用 findAndModify API 来更新最新的文档。如果你想使用其他方式,则必须在文档中使用一些锁定字段进行自定义编码。 - muruga
你能再解释一下吗?因为我不太明白。我应该使用哪种“doc”方法? - urban
请查看此解决方案 - Amr Saber
3个回答

8
假设doc包含需要刷新的文档实例,您可以按照以下方式进行通用刷新:
doc.model(doc.constructor.modelName).findOne({_id: doc._id},
    function(err, newDoc) {
        if (!err) {
            doc = newDoc;
        }
    }
);

然而,最好不要在不需要的情况下持久化/缓存Mongoose文档实例。只需缓存您需要快速访问的文档的不可变_id,而不是文档本身。


2
抱歉,我知道这篇文章很旧了,但如果还有人在寻找解决方案,我有一个更好的解决方法。
当多个用户同时访问同一文档时,您可以执行普通保存操作。Mongoose使用对象的 __v 属性来确保旧实例不会覆盖最新实例。因此,如果您有两个 doc.__v = 0 的实例,并且 A 先保存,则数据库现在具有 doc.__v = 1。因此,当 B 保存时,它会出错,因为 B.__v = 0 而不是 1。那么您可以捕获错误(应该是特定的 mongoose 错误),通过刷新对象来处理它(这应该会将其提升到 __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
如果是用let定义的,你可以直接这样做。
await thing.update(stuff);
thing = await Thing.findById(thing._id);

或者如果是使用 const,那么以不可变的方式进行操作:
await thing.update(stuff);
const updatedThing = await Thing.findById(thing._id);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接