我有一个集合存储电影和另一个存储流派的集合。电影可以属于多种流派。一个流派可以有多个电影。电影被视为一个流派的名单。用户可以在每个流派列表中订购电影。一部电影可以在每个类型列表中的不同位置。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中编入索引。
的问题是
- 由于优先级不被索引,电影和类型的大数据量将那种表现不佳
- 有没有更好的方式来对数据进行建模来解决这个问题。