Javascript Mongoosejs刷新文档

Javascript Mongoosejs刷新文档,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,假设我有一个文档,例如:var doc=Model.findOne({name:“name”}) 现在,如果该文档通过数据库的另一个连接进行编辑,则该文档不包含正确的信息。我确实需要它,所以我必须从数据库中“刷新”或“重新下载”。是否只有对象“doc”可以执行此操作?假设doc包含要刷新的文档实例,您可以执行此操作以常规刷新它: doc.model(doc.constructor.modelName).findOne({_id: doc._id}, function(err, newDo

假设我有一个文档,例如:var doc=Model.findOne({name:“name”})


现在,如果该文档通过数据库的另一个连接进行编辑,则该文档不包含正确的信息。我确实需要它,所以我必须从数据库中“刷新”或“重新下载”。是否只有对象“doc”可以执行此操作?

假设
doc
包含要刷新的文档实例,您可以执行此操作以常规刷新它:

doc.model(doc.constructor.modelName).findOne({_id: doc._id},
    function(err, newDoc) {
        if (!err) {
            doc = newDoc;
        }
    }
);

但是,最好不要将Mongoose文档实例持久化/缓存到您当前需要的范围之外。缓存您需要快速访问的文档的不可变的
\u id
,而不是文档本身。

很抱歉,我知道这很旧,但我有一个更好的解决方案,以防其他人仍在查看

在这种并发访问同一文档的情况下,您可以执行正常的保存

Mongoose使用对象的_v属性来确保旧实例不会覆盖最新实例

因此,如果您有2个doc实例,并且A先保存,那么数据库现在有doc。所以当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
        }
    }
});  

如果要更新当前对象,则可以使用findAndModify命令。您的要求是什么?假设我有两台服务器在运行,它们不断修改数据库,需要最新信息,但它们只有文档。好的,如果我正确理解您的要求,如果您只需要更新文档,那么您必须使用findAndModify API更新最新文档。如果你想用其他方法,那么你必须在文档中自定义带有锁定字段的代码。你能解释得更好一点吗,因为我不明白。我应该使用什么“doc”方法?检查。