如何从对象创建模型实例并让Mongoose知道它已经存在?我正在从缓存加载数据,所以它始终是最新的。
我尝试过使用
var instance = new SomeModel({ '_id': '...', field1: '...', field2: '...' });
但是这样Mongoose认为它是一个要插入的新对象,而不是已经存在的对象。致电instance.modifiedPaths()
会返回['_id', 'field1', 'field2']
。因此,如果我调用instance.save()
,它将尝试再次插入它并抛出重复键错误。
做正确的方法是什么?
答案 0 :(得分:1)
有一个标志指示记录是否为新记录,您可以在调用save
之前覆盖它:
var instance = new SomeModel({ '_id': '...', field1: '...', field2: '...' });
instance.isNew = false;
instance.save(function(err) { /* ... */ });
在这种情况下,Mongoose会更新记录而不是尝试插入记录。
然而,这很奇怪,您确定使用find
或其某些变体来查询数据库中的文档是不是更好?
答案 1 :(得分:0)
没有文档的Document.init()
功能正是如此。它接受一个回调作为最后一个参数,而实际上目前是无用的 - 当前实现不是异步的,回调永远不会收到错误。但是,它可能在将来发生变化,因此推荐的解决方案是:
function load (model, data, callback)
{
var w = new model();
w.init(data, {}, function (err)
{
if (err) return callback(err);
callback(null, w);
});
}