2014-04-12 119 views
1

嵌套模式的不同的方法,我想窩架構中架構,我發現在#1做它的多種方式,我想知道有什麼區別區別澄清和貓鼬

Mongoose schema within schema

var TaskSchema = new Schema({ 
    user : Schema.ObjectId 
}); 

Is it possible to reference two schemas to eachother in Mongoose?

var emailSchema = new Schema({ 
    Subject : FoodItemSchema, 
    FoodItems : [FoodItemSchema], 
    Owner : { type : Schema.Types.ObjectId , ref: "User" } 
}); 

我不明白爲什麼你不能做到以下幾點,以完成任務

var TaskSchema = new Schema({ 
    user : UserSchema 
}); 

var emailSchema = new Schema({ 
    Subject : FoodItemSchema, 
    FoodItems : [FoodItemSchema], 
    Owner : { type : OwnerSchema , ref: "User" } 
}); 

而且我對什麼是

Schema.Types.ObjectId 

Schema.ObjectId 
之間的區別很困惑

謝謝

回答

2

這兩個陳述之間沒有真正的區別,正確的是它實際上是Schema.Types.ObjectId,但其他形式是爲了方便。或者你甚至可以直接導入它。

有沒有在執行的一個明顯區別以下

現在:

var emailSchema = new Schema({ 
    Subject : FoodItemSchema, 
    FoodItems : [FoodItemSchema], 
    Owner : { type : Schema.Types.ObjectId , ref: "User" } 
}); 

在引用FoodItemSchema這是什麼實際上做的是"embed"代表的文檔中的文件的項目。一種形式作爲簡單的子文檔,另一種形式作爲這些子文檔的數組。

這是MongoDB的一個功能,您可以將「相關」文檔信息保存在實際文檔本身中。在很多情況下,這是最有效率的事情。

但在其它形式的現場Owner所有正在不停地在文檔_id值「是指」一個項目在一個單獨的集合,其中是所使用的架構的名稱。通常這將與數組一起使用,但在這種情況下,它只是一個單一的文檔引用。

因此,模型中emailSchema的實際存儲文檔實際上並不包含「用戶」信息而不是「嵌入」表單。包含的所有內容是存在於單獨集合中的文檔的_id值。

Mongoose提供了populate方法,以便允許將其他集合中的文檔「合併」到檢索時的該文檔中。結果它會「出現」,就好像文檔實際上嵌入時一樣。

但是,人口雖然很方便,但實際上只是爲了「獲取」該信息而返回數據庫並附加一個或多個查詢。因此,根據您的需求,這可能是一個性能問題。

因此,基本上應該解釋的差異。您還可以查看有關其他示例的文檔參考資料。關於Data Modelling的MongoDB文檔中還有一個很好的部分,它討論了使用嵌入或交替使用諸如Mongoose提供的「鏈接引用」的各種方法。

+0

謝謝,這是有道理的 – xbd