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 );
发布我自己的答案,所以它不会保持打开状态:
第4版模型(稳定版于2015年3月25日发布)现在公开了hydrate()
方法。最初,没有任何字段将被标记为dirty,这意味着对hydrate()
的调用在更改字段之前不会做任何事情。
save()
非常重要,请注意,这旨在将从数据库加载的普通JS对象转换为猫鼬文档。如果您从REST服务或类似的机构收到文档,则应使用https://github.com/LearnBoost/mongoose/blob/41ea6010c4a84716aec7a5798c7c35ef21aa294f/lib/model.js#L1639-1657和findById()
。
对于那些危险生活的人:
如果您真的想更新现有文档而不接触数据库,我想您可以调用update()
,将字段标记为脏,然后调用hydrate()
。这与我在原始问题中建议的设置save()
的方法没有太大不同。但是,Valeri(来自猫鼬团队)建议不要这样做。它可能会导致验证错误和其他边缘情况问题,通常不是一个好习惯。 findById确实非常快,不会成为您的瓶颈。
doc.isNew = false;
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解决它。