2015-08-23 78 views
1

我想弄清楚我將在我的NodeJS應用程序中使用的MongoDB模型的理想設計。該應用程序的設置就像一項調查,其中某些步驟可根據以前的選擇提供選項。這是一個選擇和可能性的例子。搞清楚MongoDB數據庫模型和參考

級別1:圖案的類型:固體,條紋,格子 2級(其選項不管等級1選擇):顏色:灰色,藍,綠,紅 結果:圖像是基於電平顯示的1和2級選擇。

基於此結構,數據庫的唯一元素是基於兩個選擇級別顯示的圖像。基於這個想法,我應該製作多少個集合,以及什麼是將等級1,等級2,結果之間的引用聯繫在一起以顯示正確圖像的最佳主鍵?

回答

0

我會避免使用多個集合來建模此場景,因爲MongoDB不支持連接,正如您所說的,您希望將級別1和級別2之間的引用綁定在一起。它聽起來像代表一個圖像的文檔將相當小並且很簡單 - 如果圖像具有很多顏色的可能性,則可能不適合在一個文檔中對圖像進行建模。所以我會去爲每個文檔建模一個圖像的一個集合。

聽起來你的圖像有兩個屬性,顏色和圖案。

一個簡單的模式,如果每個圖像只有1種顏色和1種模式是:

{ 
    _id: ObjectId('...'), 
    name: "image1", 
    color: "green", 
    pattern: "solid" 
} 

一個模式,它允許每個圖像具有多種顏色和圖案應該是:

{ 
    _id: ObjectId('...'), 
    name: "image1", 
    color: ["green", "red"], 
    pattern: ["plaid", "solid"] 
} 

你可以使用像這樣的查詢來查詢上述模式中的任一個:

db.images.find({ pattern:"solid", color: "green" }); 

使用Mongoose(用於Node的MongoDB對象建模庫),第一個模式看起來如下所示。請注意在應用程序代碼中使用enum將這些字段限制爲有效值。

var imageSchema = new mongoose.Schema({ 
    color: { type: String, enum: ['grey', 'blue', 'green', 'red'] }, 
    pattern: { type: String, enum: ['solid', 'stripe', 'plaid'] }, 
    name: String, 
}); 
var Image = mongoose.model('image', imageSchema, 'images'); 

Image.find({ pattern:"solid", color: "green" }).exec(callback); 
+0

謝謝!這正是我正在尋找的 – cphill