更新 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 );
最佳答案
发布我自己的答案,这样就不会保持开放状态:
版本 4 模型(2015 年 3 月 25 日稳定发布)现在公开了 hydrate()
方法。所有字段最初都不会被标记为 dirty,这意味着对 save()
的调用将不会执行任何操作,直到字段发生突变。
需要特别注意的是,它的目的是用来将从数据库加载的纯 JS 对象转换为 mongoose 文档。如果您从 REST 服务或类似的东西接收文档,您应该使用 findById()
和 update()
。
对于那些生活危险的人:
如果你真的想在不接触数据库的情况下更新现有文档,我想你可以调用 hydra()
,将字段标记为脏,然后调用 save()
。这与我在原始问题中建议的设置 doc.isNew = false;
的方法没有太大区别。然而,Valeri(来自 Mongoose 团队)建议不要这样做。它可能会导致验证错误和其他极端情况问题,通常不是好的做法。 findById 真的很快,不会成为你的瓶颈。
关于javascript - 将普通对象转换到 Mongoose 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24190478/