更新1: 5投票已经收到,所以我提交了一个功能请求:https://github.com/LearnBoost/mongoose/issues/2637
请在那里投+1票,让核心团队知道你想要这个功能。
更新2: See answer below...
原文:
假设我在集合或上执行“精简”查询,从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 );
发布于 2015-03-31 03:31:54
发布了我自己的答案,所以这不会一直开放:
版本4模型(稳定发布于2015-03-25)现在公开了一个hydrate()
方法。这些字段最初都不会被标记为脏的,这意味着在字段发生变化之前,对save()
的调用不会执行任何操作。
需要注意的是,这是为了将从数据库加载的普通JS对象转换为mongoose文档而设计的。如果您正在接收来自REST服务或类似服务的文档,则应该使用findById()
和update()
。
为那些生活在危险中的人准备的:
如果您确实希望在不接触数据库的情况下更新现有文档,我想您可以调用hydrate()
,将字段标记为脏,然后调用save()
。这与我在原始问题中建议的设置doc.isNew = false;
的方法没有太大区别。然而,Valeri (来自mongoose团队)建议不要这样做。它可能会导致验证错误和其他边缘情况问题,通常不是好的做法。findById真的很快,不会成为你的瓶颈。
发布于 2015-03-26 04:02:00
var User = mongoose.model('User');
var fields = res.body; //Response JSON
var newUser = new User(fields);
newUser.save(function(err,resource){
console.log(resource);
});
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来解决这个问题。
https://stackoverflow.com/questions/24190478
复制相似问题