我目前正在使用node-mongo-native驱动程序来使用node.js和MongoDB。
我使用存储和检索JS对象的Mongo控制台进行了一些测试。我想,如果我存储一个包含函数/方法的对象,方法和函数也将存储在集合中。这很有趣,因为我认为函数无法存储在MongoDB中(除了Mongo docs所建议的system.js集合之外)。 此外,它不仅会存储方法,还会存储对象整个原型链的每个方法和成员。除此之外,我不喜欢这种行为,并认为它不直观,我不能拥有它。
我打算在Mongo系列中管理用户。为此,我有一个User对象,其中包含用作每个用户实例的原型的所有用户方法。用户对象本身只包含用户属性。
如果我将用户存储在Mongo集合中,我只想存储用户对象的属性。没有原型成员,特别是没有原型方法。目前我还没有看到如何干净利落地做到这一点。我认为可能有用的选项是:
但是,我确实遇到了相同的问题:从集合中加载用户时。 AFAIK创建后无法在JavaScript中更改对象原型。当Mongo实例化从集合中检索的对象时,也无法指定要使用的原型。所以基本上我总是得到使用Mongo从Object继承的对象。据我所知,我有2个选项可以从这一点恢复可用的用户对象:
我的假设,尤其是关于为查询结果指定原型的可能性,是否正确?什么是正确的方法,为什么?我肯定不是第一个使用node.js在MongoDB中存储和复制对象的人。
目前我会采用方法2/2。我真的不喜欢它,但它是最有效的,也是唯一一个与API完全协同工作的人。但是,我更倾向于听说实际上API没有任何错误,但我不知道如何正确使用它。所以,请,赐教:)
答案 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)。
无论如何,希望它有所帮助!