0

我将天数 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,我使用了序列化程序,但没有使用反序列化程序,然后改为在该字段上进行排序。

4

1 回答 1

1

MongoDB 仅允许对字段进行排序以获取正向/反向值。通过使用 0 表示星期日,没有办法保留 1-6 的顺序,而是将 0 放在末尾。在 Postgres 或其他 SQL 服务器中,您可以使用自定义排序函数来实现这一点,但在 MongoDB 中没有类似物。

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

于 2013-02-04T15:51:28.100 回答