在/从MongoDB中存储和检索JavaScript对象

我目前正在使用node-mongo-native驱动程序使用node.js和MongoDB。

我testing了一下使用Mongo控制台存储和检索JS对象。 我想通了,如果我存储一个包含函数/方法的对象,方法和函数也将被存储在集合中。 这很有趣,因为我认为函数不能存储在MongoDB中(除了system.js集合,正如Mongo文档所build议的那样)。
它不仅存储方法,而且实际上是对象的整个原型链的每个方法和成员。 除此之外,我不喜欢这种行为,认为这是不直观的,我不能拥有它。

我正在pipe理Mongo集合中的用户。 要做到这一点,我有一个用户对象包含用户的每个实例作为原型的所有用户方法。 用户对象本身只包含用户属性。

如果我将用户存储在Mongo集合中,我只想存储用户对象的属性。 没有原型成员,特别是没有原型方法。 目前我没有看到如何干净地做到这一点。 我想的选项可能是:

  1. 使用foreach和hasOwnProperty创build一个浅拷贝并将其存储在集合中。
  2. 为每个包含所有对象属性的用户添加一个数据属性,并可将其存储在集合中。
  3. 刚才我想起了这个:我也可以将所有原型属性设置为不可枚举,这样可以防止它们存储在集合中。

但是,反过来,我也遇到了相同的问题:从集合中加载用户时。 AFAIK没有办法在JavaScript创build后改变对象原型。 当Mongo实例化从集合中检索到的对象时,也无法指定要使用的原型。 所以基本上我总是得到使用Mongo从Objectinheritance的对象。 据我可以告诉我有2个选项从这一点恢复一个可用的用户对象:

  1. 创build一个从Userinheritance的新对象,并将结果对象上的每个属性复制到新创build的对象。 (与存储机制1和3兼容)
  2. 创build一个从Userinheritance的新对象,并将结果对象作为数据属性存储在新创build的对象上。 (兼容存储机制2)

我的假设,特别是关于指定查询结果原型的可能性,是否正确? 什么是正确的做法,为什么? 我当然不是第一个使用node.js在MongoDB中存储和复制对象的人。

目前我会用2/2的方法去。 我不是很喜欢它,但是它是最有效率的,也是唯一一个可以和API一起干净利落的工具。 不过,我更愿意听到API实际上并没有错,但我不知道如何正确使用它。 所以,请赐教:)

我刚刚意识到,实际上可以在V8 / node中更改对象原型。 虽然这不符合标准,但可以在各种浏览器中使用,特别是在V8 / Node中!

function User(username, email) { this.username = username; this.email = email; } User.prototype.sendMail = function (subject, text) { mailer.send(this.email, subject, text); }; var o = {username: 'LoadeFromMongoDB', email: 'nomail@nomail.no'}; o.__proto__ = User.prototype; o.sendMail('Hello, MongoDB User!', 'You where loaded from MongoDB, but inherit from User nevertheless! Congratulations!'); 

这被用于各种模块和插件 – 即使核心模块使用这种技术,虽然它不是ECMAScript标准。 所以我想在node.js中使用是安全的。

我不确定我是否正在跟踪你的问题……但是有一件事情浮现在脑海中:你检查过mongoose吗? ( http://mongoosejs.com/

当涉及到定义模型和方法时,它给了你很多select。 特别是“虚拟”可能是有趣的( http://mongoosejs.com/docs/virtuals.html )。

无论如何,希望它有助于一些!