带有天数的数组上的Mongoid排序,忽略星期日(0)

时间:2013-02-04 15:31:56

标签: ruby mongoid

我将数字0-6存储在文档中的数组中。

我希望文档始终处于正确的顺序,但星期日(0)正在使麻烦,因为它将在星期一(1)之前。我怎么能以另一种方式进行这种排序?

default_scope asc(:days)

更新

因此,在尝试实现自定义序列化时遇到了一个问题:

class Schedule
  include Mongoid::Document
  field :days, type: Days  
  default_scope order_by([[:days, :asc]])
end  

class Days
  include Mongoid::Fields::Serializable

  # Convert Ruby wday format, sunday(0) - saturday(6).
  def deserialize(days)
    days.map { |day| (day + 1)%7 }
  end

  # Convert to MongoDB friendly format, monday(0) - sunday(6).
  def serialize(days)
    days.map { |day| (day + 6)%7 }
  end
end

到目前为止,自定义字段序列化按预期工作:

s2 = Schedule.create(days: [0])
s.days 
# Deserialized value => [0]
s.read_attribute :days
# Stored value => [6]

然而,Mongoid似乎对反序列化的对象进行排序?

s2 = Schedule.create(days: [1,2,3,4,5])
s2.days
# Deserialized value => [1, 2, 3, 4, 5]
s2.read_attribute :days
# Stored value => [0, 1, 2, 3, 4] 

Schedule.all
# Sorted as => [s1, s2]
# Expected sort order => [s2, s1]

通过删除反序列化确认,将以正确的顺序返回文档。值得注意的是,这是一个嵌入式文档,我想也许订购是以不同的方式完成的。

更新2: 我最后创建了第二个字段sortable_days,我使用了序列化器,但没有使用反序列化器,然后在该字段上进行排序。

1 个答案:

答案 0 :(得分:1)

MongoDB只允许在字段上对正向/反向值进行排序。通过在星期日使用0,没有办法保留1-6的排序,但最后放0。在Postgres或其他SQL服务器中,您可以使用自定义排序函数来实现此目的,但MongoDB中没有类似的东西。

您需要为此更改值编码。您可以创建此值的非规范化版本,该值具有此字段的已转换(0 => 7)值并对此字段进行排序。