我将数字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,我使用了序列化器,但没有使用反序列化器,然后在该字段上进行排序。
答案 0 :(得分:1)
MongoDB只允许在字段上对正向/反向值进行排序。通过在星期日使用0,没有办法保留1-6的排序,但最后放0。在Postgres或其他SQL服务器中,您可以使用自定义排序函数来实现此目的,但MongoDB中没有类似的东西。
您需要为此更改值编码。您可以创建此值的非规范化版本,该值具有此字段的已转换(0 => 7)值并对此字段进行排序。