0

ドキュメントの配列に0〜6日の番号を格納しています。

ドキュメントを常に正しい順序にしたいのですが、sunday(0)は、monday(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: 最終的に2番目のフィールドsortable_daysを作成しました。これは、シリアライザーを使用しましたが、デシリアライザーは使用せず、代わりにそのフィールドでソートしました。

4

1 に答える 1

1

MongoDBでは、順方向/逆方向の値のフィールドでの並べ替えのみが可能です。日曜日に0を使用すると、1〜6の順序を保持する方法はありませんが、最後に0を付けます。Postgresまたは他のSQLサーバーでは、カスタムの並べ替え関数を使用してこれを実現できますが、MongoDBには類似点がありません。

このためには、値のエンコーディングを変更する必要があります。このフィールドの変換された(0 => 7)値を持つこの値の非正規化バージョンを作成し、このフィールドで並べ替えることができます。

于 2013-02-04T15:51:28.100 に答える