簡體   English   中英

貓鼬:填充或引用架構上的 ID?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM