我有一个存储电影的集合和另一个存储流派的集合。电影可以属于多种类型。一种类型可以有多部电影。电影按类型被视为列表。用户可以在每个类型列表中订购电影。每部电影列表中的一部电影可能处于不同的位置。
假设:
我目前如何建模此数据如下。电影收藏看起来像
{ _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中编制优先级。
问题是
答案 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.movies.find({“genres”:genre_id})。sort({genres_priorities.gen:1,genres_priorities.priorities:1})
让我知道你的想法。