手动加载 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);
});
}
如何从对象创建模型实例并让 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);
});
}