将普通对象转换为mongoose文档

时间:2014-06-12 17:29:01

标签: javascript mongodb object mongoose

更新1:已收到5票,因此我提交了一项功能请求:https://github.com/LearnBoost/mongoose/issues/2637

请在那里投票+1票,让核心团队知道你想要这个功能。


更新2: See answer below ...


原始帖子:

让我们说我做了一个"精益"查询集合 OR 从REST服务接收一些数据,我得到一个对象数组(而不是mongoose文档)。

这些对象已存在于数据库中,但我需要将部分/全部对象转换为mongoose文档以进行单独编辑/保存。

我已经阅读了源代码,一旦mongoose拥有来自数据库的数据(填充,转换,初始化等),就会有很多事情发生,但似乎并不是一种方法。暴露'这对外界来说。

我正在使用以下内容,但它看起来很简陋($data是一个普通对象):

// What other properties am I not setting?  Is this enough?
var doc = new MyModel( $data );
doc.isNew = false;

// mimicking mongoose internals
// "init" is called internally after a document is loaded from the database
// This method is not documented, but seems like the most "proper" way to do this.
var doc = new MyModel( undefined );
doc.init( $data );

更新:经过更多搜索,我认为还没有办法做到这一点,上面的第一种方法是你最好的选择(mongoose v3.8.8)。如果其他人对此感兴趣,我会针对此类内容发出功能请求(请发表评论或发表评论):

var doc = MyModel.hydrate( $data );

2 个答案:

答案 0 :(得分:8)

发布我自己的答案,以便不会保持开放状态

版本4模型(2015-03-25发布的稳定版)现在公开了hydrate()方法。这些字段最初都不会被标记为 dirty ,这意味着在字段发生变异之前,对save()的调用将不会执行任何操作。

https://github.com/LearnBoost/mongoose/blob/41ea6010c4a84716aec7a5798c7c35ef21aa294f/lib/model.js#L1639-1657

非常重要的是要注意,这是用于将从数据库加载的普通JS对象转换为mongoose文档。如果您从REST服务或类似的服务接收文档,则应使用findById()update()

对于那些生活危险的人:

如果您确实想要在不触及数据库的情况下更新现有文档,我想您可以调用hydrate(),将字段标记为脏,然后调用save()。这与我在原始问题中建议的设置doc.isNew = false;的方法没有什么不同(除了你不必将字段标记为脏)。然而,瓦列里(来自猫鼬队)建议不要这样做。在某些情况下,它可能会导致验证错误(和其他问题),通常不是一种好的做法。

答案 1 :(得分:-2)

  1. 如果您从REST服务获得响应并说您拥有用户mongoose模型
  2. var User = mongoose.model('User');
    var fields = res.body; //Response JSON
    var newUser = new User(fields);
    newUser.save(function(err,resource){
      console.log(resource);
    });

    1. 在其他情况下,假设您有一个来自User.find()的用户JSON对象数组,您想要查询或填充
    2. var query  = User.find({});
      query.exec(function(users){
        //mongoose deep-populate ref docs
        User.deeppopulate users 'email_id phone_number'.exec({
          //query through populated users objects
        });
      });

      MongoDB不支持联接和转移。所以现在你不能直接将值转换为对象。虽然你可以用forEach解决它。