我有一個集合存儲電影和另一個存儲流派的集合。電影可以屬於多種流派。一個流派可以有多個電影。電影被視爲一個流派的名單。用戶可以在每個流派列表中訂購電影。一部電影可以在每個類型列表中的不同位置。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中編入索引。
的問題是
- 由於優先級不被索引,電影和類型的大數據量將那種表現不佳
- 有沒有更好的方式來對數據進行建模來解決這個問題。