猫鼬文档的普通对象

问题描述 投票:24回答:2

UPDATE 1:已收到5票,所以​​我已提交功能请求:https://github.com/LearnBoost/mongoose/issues/2637

请在此投+1票,让核心团队知道您想要此功能。


UPDATE 2:See answer below...


原始帖子:

让我对集合进行“精简”查询OR从REST服务接收一些数据,然后得到一个对象数组(不是猫鼬文档)。

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

我已经阅读了源代码,一旦猫鼬从数据库中获取了数据(填充,转换,初始化等),就会发生很多事情,但是似乎没有一种方法可以将其“暴露”给外部世界。

我正在使用以下内容,但似乎很hacky($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 );

UPDATE:经过更多搜索之后,我认为尚无办法,并且上面的第一种方法是最好的选择(猫鼬v3.8.8)。如果其他人对此感兴趣,我将提出类似这样的功能请求(请留下评论或赞):

var doc = MyModel.hydrate( $data );
javascript mongodb object mongoose
2个回答
9
投票

发布我自己的答案,所以它不会保持打开状态:

第4版模型(稳定版于2015年3月25日发布)现在公开了hydrate()方法。最初,没有任何字段将被标记为dirty,这意味着对hydrate()的调用在更改字段之前不会做任何事情。

save()

非常重要,请注意,这旨在将从数据库加载的普通JS对象转换为猫鼬文档。如果您从REST服务或类似的机构收到文档,则应使用https://github.com/LearnBoost/mongoose/blob/41ea6010c4a84716aec7a5798c7c35ef21aa294f/lib/model.js#L1639-1657findById()

对于那些危险生活的人:

如果您真的想更新现有文档而不接触数据库,我想您可以调用update(),将字段标记为脏,然后调用hydrate()。这与我在原始问题中建议的设置save()的方法没有太大不同。但是,Valeri(来自猫鼬团队)建议不要这样做。它可能会导致验证错误和其他边缘情况问题,通常不是一个好习惯。 findById确实非常快,不会成为您的瓶颈。


-2
投票
  1. 如果您从REST服务获得响应,并说您有一个User mongoose模型,>
doc.isNew = false;
  1. 在另一种情况下,您有一个要查询或填充的User.find()中的用户JSON对象数组

var User = mongoose.model('User');
var fields = res.body; //Response JSON
var newUser = new User(fields);
newUser.save(function(err,resource){
  console.log(resource);
});

MongoDB不支持加入和转移。因此,目前您无法直接将值转换为对象。尽管您可以使用forEach解决它。

© www.soinside.com 2019 - 2024. All rights reserved.