【发布时间】:2014-03-15 00:07:16
【问题描述】:
我有一个存储电影的集合和另一个存储流派的集合。一部电影可以属于多种类型。一个流派可以有多部电影。电影被视为按类型列出的列表。用户可以在每个流派列表中订购电影。一部电影可以在每个流派列表中的不同位置。
假设:
- 类型和类型中的电影都可以增长到非常大的数量。
- 电影始终按类型阅读,并根据用户的排序方式排序。
- 某一类型的电影顺序可能会经常变化。
- 可以随时添加新电影和类型。
我目前对这些数据的建模方式如下。电影合集的样子
{ _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 中被索引,因为它是一个字典。
问题是
- 考虑到优先级未被索引,在电影和流派的大量数据中,排序将表现不佳
- 有没有更好的数据建模方法来解决这个问题。
【问题讨论】:
标签: mongodb sorting data-modeling