javascript - 将普通对象转换到 Mongoose 文档

标签 javascript mongodb object mongoose

更新 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() 的调用将不会执行任何操作,直到字段发生突变。

https://github.com/LearnBoost/mongoose/blob/41ea6010c4a84716aec7a5798c7c35ef21aa294f/lib/model.js#L1639-1657

需要特别注意的是,它的目的是用来将从数据库加载的纯 JS 对象转换为 mongoose 文档。如果您从 REST 服务或类似的东西接收文档,您应该使用 findById()update()

对于那些生活危险的人:

如果你真的想在不接触数据库的情况下更新现有文档,我想你可以调用 hydra(),将字段标记为脏,然后调用 save()。这与我在原始问题中建议的设置 doc.isNew = false; 的方法没有太大区别。然而,Valeri(来自 Mongoose 团队)建议不要这样做。它可能会导致验证错误和其他极端情况问题,通常不是好的做法。 findById 真的很快,不会成为你的瓶颈。

关于javascript - 将普通对象转换到 Mongoose 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24190478/

相关文章:

javascript - 清除 HTML 中的单个表单字段

javascript - 如何使用同位素为 Knockout observableArray 中的项目布置 HTML 元素?

javascript - 下拉菜单在理论上显示但在实践中不显示

当数据库为空时,mongodb 创建 80 多个文件,每个文件 2GB

java - 从一类访问另一类

javascript - 删除 a.x 与 a.x = undefined

php - MongoDB/DocumentDB bson_append_array() : invalid array detected. 数组参数的第一个元素不是 "0"

node.js - 使用对象作为在 router.get 中查找值的键

arrays - 尝试将对象映射器模型转换为数组

javascript - 创建对象并将它们存储在数组中