[英]Mongoose: Populate or reference Id on Schema?
我想知道哪個在性能方面更好。
假設我有這個菜單架構
{
restaurant: { type: String, unique: true, required: true },
color: { type: String, required: true },
}
我有這個 Plate Schema
{
name: { type: String, unique: true, required: true },
}
如果我想從菜單中獲取所有盤子,哪個選項更好?
將菜單與盤子關聯起來,如下所示:
{
restaurant: { type: String, unique: true, required: true },
color: { type: String, required: true },
plates: [
type: Schema.Types.ObjectId,
ref: 'plate'
]
}
或者像這樣:
{
name: { type: String, unique: true, required: true },
menu: {
type: Schema.Types.ObjectId,
ref: 'plate'
}
}
對於第一個選項,我將使用Menu.findById(id).populate('plates')
來獲取菜單和與之相關的所有盤子。 但是對於第二個選項,我會使用Plate.find({menu: menu_id})
那么,考慮到我可以有任意數量的盤子,哪個更快?
如果它們相同,是否有更好的方法將 Plate 和 Menu 關聯起來並從 Menu 獲取盤子?
就性能而言,第二個會更快,因為第一個會在幕后執行$lookup
(在執行populate
時),這實際上是額外的數據庫調用。
我會建議第三個選項,這在您的用例中是最好的。 那就是將plate文檔嵌入到menu文檔中。
{
restaurant: { type: String, unique: true, required: true },
color: { type: String, required: true },
plates: [
{
name: { type: String }
}
]
}
這樣,菜單文檔將包含您需要的所有信息,您可以通過一次數據庫調用獲取所有信息。
注意: MongoDB 中每個文檔有 16MB 的限制。 您肯定可以毫無問題地在每個菜單中存儲數千或數萬個盤子。 但是如果您需要在每個菜單中存儲更多內容,那么您應該進行一些初始設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.