在MongoDB中存储和检索JavaScript对象

时间:2011-04-25 10:49:55

标签: object mongodb prototype node.js

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

我使用存储和检索JS对象的Mongo控制台进行了一些测试。我想,如果我存储一个包含函数/方法的对象,方法和函数也将存储在集合中。这很有趣,因为我认为函数无法存储在MongoDB中(除了Mongo docs所建议的system.js集合之外)。 此外,它不仅会存储方法,还会存储对象整个原型链的每个方法和成员。除此之外,我不喜欢这种行为,并认为它不直观,我不能拥有它。

我打算在Mongo系列中管理用户。为此,我有一个User对象,其中包含用作每个用户实例的原型的所有用户方法。用户对象本身只包含用户属性。

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

  1. 使用foreach和hasOwnProperty创建浅表副本,并将此副本存储在集合中。
  2. 向每个包含所有对象属性的用户添加数据属性,并将其存储在集合中。
  3. 我刚才想到写这个:我还可以将所有原型属性设置为不可枚举哪些应该阻止它们存储在集合中。
  4. 但是,我确实遇到了相同的问题:从集合中加载用户时。 AFAIK创建后无法在JavaScript中更改对象原型。当Mongo实例化从集合中检索的对象时,也无法指定要使用的原型。所以基本上我总是得到使用Mongo从Object继承的对象。据我所知,我有2个选项可以从这一点恢复可用的用户对象:

    1. 创建一个从User继承的新对象,并将结果对象上的每个属性复制到新创建的对象。 (兼容存储机制1& 3)
    2. 创建一个从User继承的新对象,并将结果对象作为数据属性存储在新创建的对象上。 (与存储机制2兼容)
    3. 我的假设,尤其是关于为查询结果指定原型的可能性,是否正确?什么是正确的方法,为什么?我肯定不是第一个使用node.js在MongoDB中存储和复制对象的人。

      目前我会采用方法2/2。我真的不喜欢它,但它是最有效的,也是唯一一个与API完全协同工作的人。但是,我更倾向于听说实际上API没有任何错误,但我不知道如何正确使用它。所以,请,赐教:)

2 个答案:

答案 0 :(得分:10)

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

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中使用是安全的。

答案 1 :(得分:3)

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

在定义模型和方法时,它为您提供了很多选择。特别是“虚拟”可能是有意义的(http://mongoosejs.com/docs/virtuals.html)。

无论如何,希望它有所帮助!