Object 在MongoDB中存储和检索JavaScript对象

Object 在MongoDB中存储和检索JavaScript对象,object,mongodb,prototype,node.js,Object,Mongodb,Prototype,Node.js,我目前正在使用node mongo本机驱动程序处理node.js和MongoDB 我对使用Mongo控制台存储和检索JS对象进行了一些测试。我发现,如果我存储一个包含函数/方法的对象,那么这些方法和函数也将存储在集合中。这很有趣,因为我认为函数不能存储在MongoDB中(除了system.js集合,正如所建议的)。 此外,它不仅会存储方法,实际上还会存储对象整个原型链中的每个方法和成员。除此之外,我不喜欢这种行为,认为这是不直观的,我不能有这种行为 我打算在Mongo集合中管理用户。为此,我有一

我目前正在使用node mongo本机驱动程序处理node.js和MongoDB

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

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

如果我在Mongo集合中存储用户,我只想存储用户对象的自身属性。没有原型成员,尤其是没有原型方法。目前我不知道如何干净地做到这一点。我认为可能有效的选项有:

  • 使用foreach和hasOwnProperty创建浅层副本,并将此副本存储在集合中
  • 向每个用户添加一个数据属性,该属性包含对象的所有属性,并且可以存储在集合中
  • 写这篇文章时我想到了这一点:我还可以将所有原型属性设置为不可枚举,这将阻止它们存储在集合中
  • 但是,在另一方面,我也有同样的问题:从集合加载用户时。AFAIK在JavaScript中创建对象原型后,无法更改它。当Mongo实例化从集合中检索到的对象时,也无法指定要使用的原型。所以基本上我总是使用Mongo从Object继承对象。据我所知,从现在开始,我有两个选项来恢复可用的用户对象:

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


    目前我会采用2/2的方法。我真的不喜欢它,但它是最有效的,也是唯一一个可以干净地使用API的。然而,我更希望听到API没有做错什么,但我不知道如何正确使用它。所以,请告诉我:)

    我不确定我是否完全明白你的问题。。。但我想到一件事:你有没有检查过猫鼬ORM?()

    在定义模型和方法时,它为您提供了很多选择。特别是“虚拟”可能会引起兴趣()


    不管怎样,希望它能帮助一些人

    我最近才意识到,实际上可以在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。但是我不喜欢它。我想要的是在处理对象属性存储时使用Mongo和JavaScript的某种“最佳实践”。不是别的图书馆。不过,谢谢你的回答!我很高兴看到您能够在mongodb中使用JS函数存储对象(使用mongodb本机驱动程序?),但驱动程序似乎跳过了对象方法,只存储具有可接受类型(字符串、数字、数组、对象等)的属性。你做了什么特别的事吗?还是我看错了你的问题?你不能在MongoDB中存储这些方法。我正在做的是将Mongo驱动程序返回的JS对象上的原型替换成我想要的样子。这将允许它调用原型上存在的方法,就像它们存在于驱动程序返回的对象上一样。如果您在理解这一点上有困难,您应该阅读JS中原型继承是如何工作的。好的,感谢您的澄清,因为这一部分非常误导:“我发现,如果我存储一个包含functinos/methods的对象,那么这些方法和函数也将存储在集合中。这很有趣,因为我认为函数不能存储在MongoDB中(Mongo文档建议的system.js集合除外)。“--所以是的,函数不能存储在MongoDB中。