2014-08-27 63 views
2

我正在構建基於Node.js + Express + Mongoose的CMS。我需要業務和數據訪問方法的抽象層。所以我有包含調用數據庫的方法的biz類。在不存儲所有屬性的情況下擴展Mongoose模型

這些調用是直接使用Mongoose模型製作的,所以我的邏輯實體是Mongoose實體

問題是某些邏輯實體並不總是與其數據庫實體相同。

例如:我有一個名爲「Item」的模型及其屬性,這些屬性必須存儲到數據庫中,這很好。現在,我需要一個新的屬性,名爲「similar_items」的數組,最終可以包含其他項目的列表,但我不想將此屬性存儲在數據庫中。

var itemSchema = new Schema({ 
    id: { type: Number, index: true }, 
    name: { type: String } 
}); 

var item = mongoose.model('Item', itemSchema);  
var data = new Item(); 
/* do stuff.... */ 
data.similar_items = blahblah; //I can't set this property as it doesn't exists! 

是否有可能擴展一個Mongoose模型的屬性超出其模式?我知道我可以用getter和setter定義虛擬屬性,但我仍然沒有「地方」來存儲我的數組。

有什麼想法? 我應該分開我的邏輯和Mongoose模型嗎?

+0

您可以在添加'similar_items'之後對'data'發生什麼擴展?你保存它還是去掉另一層? – JohnnyHK 2014-08-27 13:50:00

+0

它根本不設置變量。如果我這樣做data.similar_items = [1,2,3]然後我用console.log(數據)檢查對象它不顯示similar_items屬性。我猜Mongoose鉤住了屬性,它檢查它是否在模式中,如果沒有,它會將其刪除。 – 2014-08-27 14:06:39

+0

正確的是,如果你在這時使用'data'作爲一個Mongoose實例,調用'data = data.toObject();'將它轉換爲一個普通的JS對象,你可以添加它屬性。 – JohnnyHK 2014-08-27 14:10:36

回答

2

如果您使用data作爲貓鼬實例在這一點上做,調用它toObject()將其轉換爲純JS對象,您可以自由修改:

data = data.toObject(); 
data.similar_items = blahblah; 
+0

另一種選擇是在模式中創建一個屬性,並將該屬性設置爲默認爲'null',並預計它將在稍後動態設置。如果已經設置了空屬性,你可以在'.find()'之後將其設置在'.post('init')'中間件中。 – steampowered 2015-07-31 22:52:56

0

您不能添加額外的屬性與貓鼬模型沒有在模式中指定它。如果要保存添加的屬性,則必須在模式級別添加此屬性。否則使用toobject()方法將其轉換爲正常的javascript對象。

data = data.toObject(); 
data.any_property_name = required_value; 

有一件事你不能在數據庫中保存這個對象。因爲它是一個普通的javascript對象。

相關問題