2011-04-25 30 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

相關問題