2011-04-25 63 views
11

我目前正在使用node-mongo-native驱动程序使用node.js和MongoDB。在MongoDB中存储和检索JavaScript对象

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

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

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

  1. 使用foreach和hasOwnProperty创建浅拷贝并将此副本存储在集合中。
  2. 为每个包含所有对象属性并可存储在集合中的用户添加一个数据属性。
  3. 这就是我想到的:我也可以设置所有的原型属性不能枚举哪些应该阻止它们存储在集合中。

但是,我确实有相同的问题,反过来:从集合加载用户。 AFAIK在创建后无法在JavaScript中更改对象原型。当Mongo实例化从集合中检索到的对象时,也无法指定要使用的原型。所以基本上我总是使用Mongo获取从Object继承的对象。至于我可以告诉我有2个选项,从这个点还原一个可用的用户对象:

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

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

目前我会用2/2的方法。我并不喜欢它,但它是效率最高的,也是唯一一个可以在API中干净利落的工具。不过,我更愿意听到API实际上没有做错,但我不知道如何正确使用它。所以,请赐教:)

回答

8

我刚刚才意识到,它实际上可以在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: '[email protected]'}; 
o.__proto__ = User.prototype; 
o.sendMail('Hello, MongoDB User!', 'You where loaded from MongoDB, but inherit from User nevertheless! Congratulations!'); 

这是用遍了各种模块和插件 - 甚至是核心模块利用这个技术,allthough它不是ECMAScript标准。所以我想在node.js中使用是安全的。

+0

我很高兴地看到你能够在mongodb中存储具有JS函数的对象(使用mongodb-native驱动程序?),但它似乎像驱动程序跳过对象方法并只存储具有可接受类型的属性(字符串,数字,数组,对象等)。你有什么特别的吗?还是我看错了你的问题? – nak 2013-02-06 02:01:03

+2

您不能在MongoDB中存储这些方法。我正在做的是将Mongo驱动程序返回的JS对象上的原型替换为我想要的任何东西。这将允许它调用原型上的方法,就好像它们出现在驱动程序返回的对象上。如果你在理解这个时遇到困难,你应该阅读JS中原型继承的工作原理。 – 2013-02-11 18:58:23

+0

好的谢谢澄清,因为这部分是非常误导性的:“我发现,如果我存储一个包含functinos /方法的对象,方法和函数也会存储在集合中,这很有趣,因为我认为函数可以不存储在MongoDB中(除了system.js集合,由Mongo文档提供)。“ - 所以是的功能不能存储在MongoDB中。 – nak 2013-02-12 18:19:28

3

我不确定我在跟踪你的问题......但是有一件事想起来了:你检查了Mongoose ORM吗? (http://mongoosejs.com/

它提供了很多选择,当涉及到定义模型和方法。特别是“虚拟”可能是有趣的(http://mongoosejs.com/docs/virtuals.html)。

无论如何,希望它有助于一些!

+1

我知道猫鼬。但我不喜欢它。我一直在寻找的是在处理对象属性存储过程中使用Mongo和JavaScript的某种“最佳实践”。不是另一个库。尽管如此,谢谢你的回答! – 2011-04-27 10:25:01