ruby-on-rails - 在 Mongoid 中按多个字段和条件排序集合

标签 ruby-on-rails mongodb mongoid

我在一个文档中有 4 个字段,即 nameonlinelikescore。我想通过多个字段和条件对带有分页的数百万个文档的集合进行排序。

一些文档示例:

我的用户文档:

{ "_id": 1, "name": "A", "online": 1, "like": 10, "score": 1 },
{ "_id": 2, "name": "B", "online": 0, "like": 9, "score": 0 },
{ "_id": 3, "name": "C", "online": 0, "like": 8, "score": 1 },
{ "_id": 4, "name": "D", "online": 1, "like": 8, "score": 0 },
{ "_id": 5, "name": "E", "online": 1, "like": 7, "score": 1 },
{ "_id": 6, "name": "F", "online": 0, "like": 10, "score": 0 },

我将通过以下示例(使用数组的示例)来解释我的观点。

ruby 语言示例,我有一个数组结构,如下所示:

[["A", 1, 10, 1],
["B", 0, 9, 1],
["C", 0, 8, 1],
["D", 1, 8, 0],
["E", 1, 7, 1],
["F", 0, 10, 0]]

如果 online1 应该再按 like 降序排序,但是当 online >0 应该按 score 的降序再次排序。

示例排序:

list.sort{|a, b| a[1] == 1 ? ([-a[1], -a[2]] <=> [-b[1], -b[2]]) : ([-a[1], -a[3]] <=> [-b[1], -b[3]]) }

结果如下:

[["A", 1, 10, 1],
["D", 1, 8, 0],
["E", 1, 7, 1],
["B", 0, 9, 1],
["C", 0, 8, 1],
["F", 0, 10, 0]]

那是数组排序,但我的问题是我有mongodb和百万文档的集合,我不能使用数组排序,因为它会很重的数据库负载,应该获取所有文档并转换为数组(包括排序) 而不是对它们进行分页,我认为这是个坏主意。

我尝试了 order()/order_by() mongoid 的可选方法,例如:

User.
order_by([:online, :desc], [:like, :desc], [:score, :desc]).
hint(online: -1, like: -1, score: -1).
page(1).per(10)

但该查询仅按 onlinescore 排序,mongoid 中是否有类似数组排序的排序方法?或者 mongodb 中有类似冒泡排序的东西?

同样的问题:Ruby on Rails: Concatenate results of Mongoid criterias and paging , merge 方法对我没有帮助,因为它可以替换第一个条件。

最佳答案

使用聚合$cond

User.collection.aggregate([
      { 
        "$project" => {
            "id" => 1, 
            "name" => 1, 
            "online" => 1, 
            "like" => 1, 
            "score" => 1,
            "sort" => {
                "$cond" => {
                   "if" => { 
                      "$eq" => ["$online", 1] 
                   },
                   "then" => "$like",
                   "else" => "$score"
                }
            }
       }
     },
     { 
        "$sort" => {
            "online" => -1,  
            "sort" => -1,
            "id" => 1
        }
     },
     {
        "$skip" => 0
     { 
        "$limit" => 12 
     }
])

引用:

  1. https://docs.mongodb.com/manual/reference/operator/aggregation/cond/
  2. https://www.oodlestechnologies.com/blogs/How-to-use-Conditional-Statements-for-sorting-data-in-MongoDB

关于ruby-on-rails - 在 Mongoid 中按多个字段和条件排序集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50166805/

相关文章:

ruby-on-rails - 你总是要运行 rake assets :precompile locally?

mongodb - 在Docker容器中运行Mongo eval返回随机字符串吗?

ruby-on-rails-3.1 - Mongoid order_by bool 值

ruby - 在 Mongoid 中使用范围数据类型

ruby-on-rails - 无方法错误 : undefined method `digest'

javascript animate 无法在 safari 和 firefox 上运行

ruby-on-rails - Ruby on Rails - 加载缓慢并在垃圾收集器中花费大量时间

c++ - 使用 Stream Builder 查询字符串

mongodb - CMD dockerfile未执行

ruby-on-rails - inverse_of 在 mongoid 中是什么意思?