2014-02-15 59 views
2

我有一個集合存儲電影和另一個存儲流派的集合。電影可以屬於多種流派。一個流派可以有多個電影。電影被視爲一個流派的名單。用戶可以在每個流派列表中訂購電影。一部電影可以在每個類型列表中的不同位置。MongoDB - 一個集合中的多個可排序列表

假設:

  • 兩個流派和電影流派可以增長到非常大的數字。
  • 電影總是按照用戶排序的類型進行排序。
  • 一個類型的電影的順序可以經常改變。
  • 新電影和流派可隨時添加。

我目前如何建模該數據如下。影片集合看起來像

{ _id:"M1", name:"The Bucket List", genres: ["G3", "G2", "G4"], priorities: { "G3":0.42, "G2":0.25, "G4":0.75 } } 
{ _id:"M1", name:"The Shawshank Redemption", genres: ["G1", "G4"], priorities: { "G4":0.1, "G1":0.2 } } 
{ _id:"M1", name:"The Italian Job", genres: ["G1", "G6", "G5"], priorities: { "G5":0.5, "G1":, "G6":0.8 } } 

流派集合看起來像

{ _id:"G1", name:"crime", moreFields:"..."} 
{ _id:"G2", name:"adventure", moreFields:"..."} 
{ _id:"G3", name:"comedy", moreFields:"..."} 
{ _id:"G4", name:"drama", moreFields:"..."} 
{ _id:"G5", name:"action", moreFields:"..."} 
{ _id:"G6", name:"thriller", moreFields:"..."} 

在電影文件存儲類型ID的該genres屬性在數組中。電影文檔中的priorities屬性通過字典ID中的流派ID存儲電影的優先級。優先級是0到1之間的數字。0是最上面的項目,1是最後一個項目。當電影X移動到另外兩部電影A和B之間時,電影X的優先級更改爲(priority of B - priority of A)/2。這允許更改電影的優先級而不更改其他電影文檔。

要填充流派列表視圖,投影是由genres排列的電影集合完成的,排序是由priorities字典爲特定類型ID完成的。像

db.movies.find({"genres":genre_id}).sort({"priorities." + genre_id: 1}); 

這將工作得很好。但是,由於它是一本字典,因此優先級不能在mongodb中編入索引。

的問題是

  1. 由於優先級不被索引,電影和類型的大數據量將那種表現不佳
  2. 有沒有更好的方式來對數據進行建模來解決這個問題。

回答

0

怎麼樣,如果我們設計的電影收藏如下

{ _id:"M1", name:"The Bucket List", genres_priorities: [{ gen:"G3", priorities : 0.42} 
                , { gen:"G2", priorities : 0.25} 
                , { gen:"G4", priorities : 0.75} 
] } 

,我們可以設置 ensureIndex({genres_priorities.gen:1,genres_priorities.priorities:1}) 查詢 db.movi​​es ({「genres」:genre_id}).sort({genres_priorities.gen:1,genres_priorities.priorities:1})

讓我知道您的想法。

相關問題