2014-02-15 61 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})

让我知道您的想法。

相关问题