【问题标题】:Load Mongoose model instance manually [duplicate]手动加载猫鼬模型实例[重复]
【发布时间】:2015-05-06 01:21:15
【问题描述】:

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

我尝试过使用

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

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

正确的做法是什么?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 缓存的整个想法不是查询数据库。无论如何感谢isNew,原来在它下面声明了未记录的函数Document.init()
      猜你喜欢
      • 2014-01-31
      • 1970-01-01
      • 2016-12-26
      • 2018-01-05
      • 1970-01-01
      • 2013-04-14
      • 2017-11-20
      • 2017-10-05
      • 2018-10-09
      相关资源
      最近更新 更多