首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将纯对象强制转换为mongoose文档

将纯对象强制转换为mongoose文档
EN

Stack Overflow用户
提问于 2014-06-13 01:29:01
回答 2查看 7.5K关注 0票数 26

更新1: 5投票已经收到,所以我提交了一个功能请求:https://github.com/LearnBoost/mongoose/issues/2637

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

更新2: See answer below...

原文:

假设我在集合上执行“精简”查询,从REST服务接收一些数据,并获得一个对象数组(而不是mongoose文档)。

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

我已经通读了源代码,一旦mongoose有了来自数据库的数据(填充、强制转换、初始化等),就会发生很多事情,但似乎没有一种方法可以将其‘暴露’给外部世界。

我正在使用下面的代码,但它看起来有点老生常谈($data是一个普通对象):

代码语言:javascript
复制
// 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)。如果其他人对此感兴趣,我会提出一个功能请求,如下所示(请留言或投票支持):

代码语言:javascript
复制
var doc = MyModel.hydrate( $data );
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-31 03:31:54

发布了我自己的答案,所以这不会一直开放:

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

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

需要注意的是,这是为了将从数据库加载的普通JS对象转换为mongoose文档而设计的。如果您正在接收来自REST服务或类似服务的文档,则应该使用findById()update()

为那些生活在危险中的人准备的

如果您确实希望在不接触数据库的情况下更新现有文档,我想您可以调用hydrate(),将字段标记为脏,然后调用save()。这与我在原始问题中建议的设置doc.isNew = false;的方法没有太大区别。然而,Valeri (来自mongoose团队)建议不要这样做。它可能会导致验证错误和其他边缘情况问题,通常不是好的做法。findById真的很快,不会成为你的瓶颈。

票数 12
EN

Stack Overflow用户

发布于 2015-03-26 04:02:00

  1. 如果您从REST服务获得响应,并说您有一个用户mongoose模型

代码语言:javascript
复制
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()的user JSON对象数组,您想要查询或填充

代码语言:javascript
复制
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来解决这个问题。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24190478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档