【问题标题】:Mongoid order_by a rounded valueMongoid order_by 取整值
【发布时间】:2013-11-18 19:18:17
【问题描述】:

我想按日期排序,然后按评级,但我希望日期四舍五入到最接近的半年(或某个时间跨度)。

这将产生按评级排序的最近 6 个月,然后按评级排序的下一个最近 6 个月的效果。

目前我有一个范围:

scope :newer_popular, order_by(:release_date => :desc, :avg_rating => :desc).where(:release_date.ne => 0, :avg_rating.ne => 0 )

显然不这样做,这会将 release_date(一个 Date 对象)视为连续排序,因此只有恰好在同一时间发布的对象才会真正按评级排序。

有没有办法在 Mongoid 中进行这种分面/分组/舍入排序?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord mongoid mongoid3


    【解决方案1】:

    我会按评分排序,并使用 where 标准作为发布日期:

    where(:release_date.gte => 6.months.ago.utc).order_by(:avg_rating => :desc)
    

    下一页:

    where(:release_date.lt => 6.months.ago.utc, :release_date.gte => 12.months.ago.utc).order_by(:avg_rating => :desc)
    

    或者类似的东西。

    【讨论】:

    • 这看起来可行。它将结果分成桶然后我将不得不提供视图,就好像它是一个连续的集合排序一样。现在我看到了,我不确定这是否是一个好的排序,但它确实给了我一些实验的想法。
    【解决方案2】:

    如果您在不减少数据的情况下显示结果,那么获取所需数据并在 Ruby 中进行编程是最容易的,这就是我们如此喜欢它的原因。

    如果您想做一些数据缩减或了解服务器端处理,那么您可以考虑使用远远超出标准 MongoDB 查询语言的操作和分组聚合框架。

    我已经为其他 SO 答案构建了聚合管道。如果你想知道这个问题的答案,请告诉我,但我可能需要一些时间来解决这个问题。

    【讨论】:

    • 我已经阅读了聚合框架,但它似乎更容易从 java 端访问(我在 java 中加载了 db)。我很想听听你是如何在 Ruby 中做到这一点的。我想根据您的建议,我倾向于在加载数据时在 java 中创建一些排序,这是一个特殊的日期字段,可以根据任何精度进行舍入。
    • 这是一个使用聚合框架和日期的可能相关的答案。 stackoverflow.com/questions/19384437/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多