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

|| 我目前正在使用node-mongo-native驱动程序来处理node.js和MongoDB。 我使用Mongo控制台存储和检索JS对象进行了一些测试。我发现,如果我存储的对象包含函数/方法,则方法和函数也将存储在集合中。这很有趣,因为我认为功能无法存储在MongoDB中(Mongo文档建议的system.js集合除外)。 它还不仅将存储方法,而且实际上将存储对象的整个原型链的每个方法和成员。除此之外,我不喜欢这种行为,并认为这是不直观的,我不应该这样。 我打算在Mongo集合中管理用户。为此,我有一个User对象,其中包含所有用户方法,这些方法用作用户每个实例的原型。用户对象本身仅包含用户属性。 如果我将用户存储在Mongo集合中,则只想存储用户对象的自身属性。没有原型成员,尤其是没有原型方法。目前,我不知道如何清洁地执行此操作。我认为可能的选项是: 使用foreach和hasOwnProperty创建浅表副本,并将此副本存储在集合中。 向包含所有对象属性的每个用户添加一个数据属性,并且可以将其存储在集合中。 这就是我写的想法:我还可以将所有原型属性设置为不可枚举,这将阻止它们存储在集合中。 但是,从另一个方面来看,我确实存在相同的问题:从集合加载用户时。 AFAIK创建后无法在JavaScript中更改对象原型。而且,Mongo实例化从集合中检索到的对象时,也没有办法指定要使用的原型。因此,基本上,我总是使用Mongo获得从Object继承的对象。据我所知,从现在开始,我有2个选项可以还原可用的用户对象: 创建一个从User继承的新对象,并将结果对象上的每个属性复制到新创建的对象。 (兼容存储机制1和3) 创建一个继承自User的新鲜对象,并将结果对象作为数据属性存储在新创建的对象上。 (与存储机构2兼容) 我的假设,特别是关于为查询结果指定原型的可能性,是否正确?什么是正确的方法,为什么?我当然不是第一个使用node.js在MongoDB中存储对象或从中恢复对象的第一人。 目前,我将采用方法2/2。我不太喜欢它,但是它是最有效的,也是唯一可以与API完美结合的工具。但是,我宁愿听到该API确实没有做错任何事情,但我这样做是因为不知道如何正确使用它。所以,请赐教:)     
已邀请:
我最近才意识到,实际上可以在V8 /节点中更改对象原型。虽然这不是标准,但它可能在各种浏览器中,尤其是在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 ORM? (http://mongoosejs.com/) 在定义模型和方法时,它提供了很多选择。特别是\“ Virtuals \”可能是令人感兴趣的(http://mongoosejs.com/docs/virtuals.html)。 无论如何,希望对您有所帮助!     

要回复问题请先登录注册