手动加载 Mongoose 模型实例

Load Mongoose model instance manually

如何从对象创建模型实例并让 Mongoose 知道它已经存在?我正在从缓存中加载数据,因此它始终是最新的。

我试过使用

var instance = new SomeModel({ '_id': '...', field1: '...', field2: '...' });

但是 Mongoose 认为这是一个要插入的新对象,而不是已经存在的对象。调用 instance.modifiedPaths() returns ['_id', 'field1', 'field2']。因此,如果我调用 instance.save(),它将尝试再次插入并抛出重复键错误。

正确的做法是什么?

有一个标志表明记录是否是新的,你可以在调用之前覆盖它 save:

var instance = new SomeModel({ '_id': '...', field1: '...', field2: '...' });
instance.isNew = false;
instance.save(function(err) { /* ... */ });

在这种情况下,Mongoose 将更新记录而不是尝试插入它。

然而,这很奇怪,您确定使用 find 或其某些变体从数据库中查询文档不是更好吗?

有一个未记录的 Document.init() 函数可以做到这一点。它接受一个回调作为最后一个参数,而实际上目前是无用的——当前的实现不是异步的,回调永远不会收到错误。不过以后可能会有变化,所以推荐的方案是:

function load (model, data, callback)
{
    var w = new model();
    w.init(data, {}, function (err)
    {
        if (err) return callback(err);
        callback(null, w);
    });
}