更新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 );
答案 0 :(得分:8)
发布我自己的答案,以便不会保持开放状态
版本4模型(2015-03-25发布的稳定版)现在公开了hydrate()
方法。这些字段最初都不会被标记为 dirty ,这意味着在字段发生变异之前,对save()
的调用将不会执行任何操作。
非常重要的是要注意,这是用于将从数据库加载的普通JS对象转换为mongoose文档。如果您从REST服务或类似的服务接收文档,则应使用findById()
和update()
。
对于那些生活危险的人:
如果您确实想要在不触及数据库的情况下更新现有文档,我想您可以调用hydrate()
,将字段标记为脏,然后调用save()
。这与我在原始问题中建议的设置doc.isNew = false;
的方法没有什么不同(除了你不必将字段标记为脏)。然而,瓦列里(来自猫鼬队)建议不要这样做。在某些情况下,它可能会导致验证错误(和其他问题),通常不是一种好的做法。
答案 1 :(得分:-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);
});
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解决它。