【发布时间】:2011-08-12 06:26:17
【问题描述】:
我目前正在使用 node-mongo-native 驱动程序使用 node.js 和 MongoDB。
我使用 Mongo 控制台存储和检索 JS 对象进行了一些测试。我发现,如果我存储一个包含函数/方法的对象,则方法和函数也将存储在集合中。这很有趣,因为我认为函数不能存储在 MongoDB 中(system.js 集合除外,正如Mongo docs 所建议的那样)。
此外,它不仅会存储方法,而且实际上会存储对象整个原型链的每个方法和成员。除此之外,我不喜欢这种行为,并认为它不直观,我不能拥有它。
我打算管理 Mongo 集合中的用户。为此,我有一个 User 对象,其中包含所有用户方法,用作每个用户实例的原型。用户对象本身只包含用户属性。
如果我将用户存储在 Mongo 集合中,我只想存储用户对象自己的属性。没有原型成员,尤其是没有原型方法。目前我看不到如何干净地做到这一点。我认为可能有效的选项是:
- 使用 foreach 和 hasOwnProperty 创建一个浅拷贝,并将该拷贝存储在集合中。
- 为每个用户添加一个数据属性,该属性包含对象的所有属性并且可以存储在集合中。
- 我刚想到写这个:我还可以将所有原型属性设置为不可枚举,应该阻止它们存储在集合中。
但是,反过来我也有同样的问题:从集合中加载用户时。 AFAIK 在创建对象原型后无法更改 JavaScript 中的对象原型。当 Mongo 实例化从集合中检索到的对象时,也无法指定要使用的原型。所以基本上我总是使用 Mongo 获取从 Object 继承的对象。据我所知,从此时起,我有 2 个选项可以恢复可用的用户对象:
- 创建一个继承自 User 的新对象,并将结果对象的每个属性复制到新创建的对象。 (兼容存储机制 1 和 3)
- 创建一个继承自 User 的新对象,并将结果对象作为数据属性存储在新创建的对象上。 (兼容存储机制2)
我的假设是否正确,尤其是关于为查询结果指定原型的可能性?什么是正确的方法,为什么?我肯定不是第一个使用 node.js 在 MongoDB 中存储和恢复对象的人。
目前我会采用 2/2 的方法。我不是很喜欢它,但它是最有效的,也是唯一一个与 API 一起干净地工作的。但是,我更愿意听到 API 实际上并没有做错什么,但我这样做是因为不知道如何正确使用它。所以请赐教:)
【问题讨论】:
标签: object mongodb prototype node.js