【问题标题】:MongoDB - Multiple sortable lists in one collectionMongoDB - 一个集合中的多个可排序列表
【发布时间】: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 中被索引,因为它是一个字典。

问题是

  1. 考虑到优先级未被索引,在电影和流派的大量数据中,排序将表现不佳
  2. 有没有更好的数据建模方法来解决这个问题。

【问题讨论】:

    标签: mongodb sorting data-modeling


    【解决方案1】:

    如果我们将电影收藏设计如下

    { _id:"M1", name:"The Bucket List", genres_priorities: [{ gen:"G3", priorities : 0.42}
                                                      , { gen:"G2", priorities : 0.25}
                                                      , { gen:"G4", priorities : 0.75}
    ] }
    

    我们可以设置 确保索引({genres_priorities.gen:1,genres_priorities.priorities:1}) 查询 db.movi​​es.find({"genres":genre_id}).sort({genres_priorities.gen:1,genres_priorities.priorities:1})

    让我知道你的想法。

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 2013-11-10
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2013-10-18
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多