MongoDB - 一个集合中的多个可排序列表

时间:2014-02-15 15:26:50

标签: mongodb sorting data-modeling

我有一个存储电影的集合和另一个存储流派的集合。电影可以属于多种类型。一种类型可以有多部电影。电影按类型被视为列表。用户可以在每个类型列表中订购电影。每部电影列表中的一部电影可能处于不同的位置。

假设:

  • 流派中的流派和电影都可以增长到非常大的数量。
  • 电影总是根据用户的排序方式按类型进行阅读。
  • 流派中的电影顺序可能会经常变化。
  • 可以随时添加新电影和流派。

我目前如何建模此数据如下。电影收藏看起来像

{ _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:"..."}

电影文档中的genres属性将类型ID存储在数组中。电影文档中的priorities属性通过字典中的类型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. 是否有更好的方法来模拟数据以解决此问题。

1 个答案:

答案 0 :(得分: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.find({“genres”:genre_id})。sort({genres_priorities.gen:1,genres_priorities.priorities:1})

让我知道你的想法。