2014-12-04 41 views
0

我們一直在使用MongoDB一段時間了,並且有一件事我只是無法環繞我的頭。比方說,我有一個讓用戶的AA集合觀察名單或喜愛的物品清單如下:MongoDB關係數據結構與_id的數組

usersCollection = [ 
    { 
     _id: 1, 
     name: "Rob", 
     itemWatchList:[ 
      "111111", 
      "222222", 
      "333333" 
     ] 

    } 
]; 

和項目

itemsCollection = [ 
    { 
     _id:"111111", 
     name: "Laptop", 
     price:1000.00 
    }, 
    { 
     _id:"222222", 
     name: "Bike", 
     price:123.00 
    }, 
    { 
     _id:"333333", 
     name: "House", 
     price:500000.00 
    } 
]; 

的單獨收集顯然,我們不想插入整個項目itemWatchList數組中的obj,因爲項目數據可能會更改,即價格。

假設我們將該用戶拉到GUI並想要顯示用戶itemWatchList的網格。我們不能,因爲我們所有的都是ID的列表。是唯一選擇做第二個collection.find([itemWatchList]),然後在結果回調中操作用戶記錄以顯示當前項目?這個問題就是如果我返回一個數組的多個用戶,每個用戶都有一個itemWatchList的數組,這將是一個回調噩夢,試圖保持結果直。我知道Map Reduce或Aggregation框架不能遍歷多個集合。

這裏的最佳實踐是什麼?是否有更好的數據結構可以用來避免這個問題?

+1

您目前的結構非常理想。您需要使用像貓鼬這樣的模塊來提供參考解析功能。 - http://mongoosejs.com/docs/populate.html。 NodeJS本地驅動程序 - 你需要自己做兩個查詢。 – BatScream 2014-12-04 01:33:21

回答

0

如何顯示關係數據有3種不同的選項。沒有一個是完美的,但是您選擇的那個可能不是您用例的最佳選擇。

選項1 - 引用ID 這是您已選擇的選項。保留一個ID列表,通常位於要引用的對象數組中。稍後要顯示它們,您需要進行第二次往返查詢,查詢爲$in

選項2 - 子文檔 這可能是您的情況的一個不好的解決方案。這意味着將存儲在items集合中的整個文檔作爲子文檔放入您的用戶集合中。如果一次只有一個用戶可以擁有一件物品,這非常棒。 (例如,不同的運送和帳單地址。)

選擇3 - 組合 這可能是你最好的選擇,但它會意味着改變你的架構。例如,假設您的物品有20個屬性,但您只關心大多數屏幕的名稱和價格。然後你有這樣的模式:

usersCollection = [ 
    { 
     _id: 1, 
     name: "Rob", 
     itemWatchList:[ 
      { 
       _id:"111111", 
       name: "Laptop", 
       price:1000.00 
      }, 
      { 
       _id:"222222", 
       name: "Bike", 
       price:123.00 
      }, 
      { 
       _id:"333333", 
       name: "House", 
       price:500000.00 
      } 
     ] 
    } 
]; 

itemsCollection = [ 
    { 
     _id:"111111", 
     name: "Laptop", 
     price:1000.00, 
     otherAttributes: ... 
    }, 
    { 
     _id:"222222", 
     name: "Bike", 
     price:123.00 
     otherAttributes: ... 
    }, 
    { 
     _id:"333333", 
     name: "House", 
     price:500000.00, 
     otherAttributes: ... 
    } 
]; 

難點是,你然後必須保持這些項目相互同步。 (這就是最終的一致性。)如果你有一個低風險的申請(不是銀行業務,醫療保健等),這不是什麼大問題。您可以連續發生兩個更新查詢,將具有該項目的用戶更新爲新價格。如果你注意,你會注意到在某些網站上的這種延遲。例如,易趣網站在搜索結果頁面上的價格通常與打開實際頁面後的實際價格不同,即使您返回並刷新搜索結果。

祝你好運!