gpt4 book ai didi

object - 在 MongoDB 中存储和检索 JavaScript 对象

转载 作者:IT老高 更新时间:2023-10-28 13:12:01 29 4
gpt4 key购买 nike

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

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

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

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

  1. 使用 foreach 和 hasOwnProperty 创建一个浅拷贝,并将该拷贝存储在集合中。
  2. 为每个用户添加一个数据属性,该属性包含对象的所有属性并且可以存储在集合中。
  3. 我想到了写这个:我还可以将所有原型(prototype)属性设置为不可枚举,应该阻止它们存储在集合中。

但是,反过来我也有同样的问题:从集合中加载用户时。 AFAIK 在创建对象原型(prototype)后无法更改 JavaScript 中的对象原型(prototype)。当 Mongo 实例化从集合中检索到的对象时,也无法指定要使用的原型(prototype)。所以基本上我总是使用 Mongo 获取从 Object 继承的对象。据我所知,从此时起,我有 2 个选项可以恢复可用的用户对象:

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

我的假设是否正确,尤其是关于为查询结果指定原型(prototype)的可能性?什么是正确的方法,为什么?我肯定不是第一个使用 node.js 在 MongoDB 中存储和恢复对象的人。

目前我会采用 2/2 的方法。我不是很喜欢它,但它是最有效的,也是唯一一个与 API 一起干净地工作的。但是,我更愿意听到 API 实际上并没有做错什么,但我这样做是因为不知道如何正确使用它。所以请赐教:)

最佳答案

我最近才意识到,实际上可以在 V8/node 中更改对象原型(prototype)。虽然这不在标准中,但在各种浏览器中是可能的,尤其是在 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 中使用是安全的。

关于object - 在 MongoDB 中存储和检索 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5777641/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com