Ruby 有没有办法使用mongoid来确保地理哈希顺序?

Ruby 有没有办法使用mongoid来确保地理哈希顺序?,ruby,mongodb,mongoid,Ruby,Mongodb,Mongoid,有没有办法使用mongoid来确保地理哈希顺序 目前我以这种方式存储它,并在回调中执行一些魔术来确保顺序: field :location, type: Hash // { :lng => 33.33, :lat => 45 } set_callback(:save, :before) do |doc| if doc.location_changed? doc.location = {lng: doc.location[:lng], lat: doc.locatio

有没有办法使用mongoid来确保地理哈希顺序

目前我以这种方式存储它,并在回调中执行一些魔术来确保顺序:

field :location, type: Hash // { :lng => 33.33, :lat => 45 }

set_callback(:save, :before) do |doc|
  if doc.location_changed?
      doc.location = {lng: doc.location[:lng], lat: doc.location[:lat]}
  end
end

可能有某种方法可以将此哈希声明为类。我考虑过嵌入文档,但它有_id。

使用
BSON::OrderedHash

BSON::OrderedHash[:lng => 33.33, :lat => 45]

使用BSON::OrderedHash

BSON::OrderedHash[:lng => 33.33, :lat => 45]

可以为此使用mongoid

下面是一个很好的例子:

以下是我自己的实现,它将位置作为数组存储在mongodb中:

class LatLng
  include Mongoid::Fields::Serializable

  attr_reader :lat, :lng

  def serialize(value)
    return if value.nil?

    if value.is_a?(self.class)
      [value.lng.to_f, value.lat.to_f]
    elsif value.is_a?(::Hash)
      hash = value.with_indifferent_access
      [hash['lng'].to_f, hash['lat'].to_f]
    end
  end

  def deserialize(value)
    return if value.nil?

    value.is_a?(self.class) ? value : LatLng.new(value[1], value[0])
  end

  def initialize(lat, lng)
    @lat, @lng = lat.to_f, lng.to_f
  end

  def [](arg)
    case arg
      when "lat"
        @lat
      when "lng"
        @lng
    end
  end

  def to_a
    [lng, lat]
  end

  def ==(other)
    other.is_a?(self.class) && other.lat == lat && other.lng == lng
  end
end

可以为此使用mongoid

下面是一个很好的例子:

以下是我自己的实现,它将位置作为数组存储在mongodb中:

class LatLng
  include Mongoid::Fields::Serializable

  attr_reader :lat, :lng

  def serialize(value)
    return if value.nil?

    if value.is_a?(self.class)
      [value.lng.to_f, value.lat.to_f]
    elsif value.is_a?(::Hash)
      hash = value.with_indifferent_access
      [hash['lng'].to_f, hash['lat'].to_f]
    end
  end

  def deserialize(value)
    return if value.nil?

    value.is_a?(self.class) ? value : LatLng.new(value[1], value[0])
  end

  def initialize(lat, lng)
    @lat, @lng = lat.to_f, lng.to_f
  end

  def [](arg)
    case arg
      when "lat"
        @lat
      when "lng"
        @lng
    end
  end

  def to_a
    [lng, lat]
  end

  def ==(other)
    other.is_a?(self.class) && other.lat == lat && other.lng == lng
  end
end

请注意,为了确保地理空间索引始终在所有驱动程序下正常工作,应该对包含纬度和经度的字段使用数组而不是子文档(“哈希”):(请参见第一个注释)我知道这一点。尝试找到更优雅的方法。请注意,为了确保地理空间索引在所有驱动程序下都能正常工作,您应该对包含纬度和经度的字段使用数组而不是子文档(“哈希”):(请参见第一个注释)我知道这一点。试图找到更优雅的方法。在ruby 1.9中,哈希已经被排序了-BSON::OrderedHash只是Hash的别名。我找到了另一个解决办法。希望它也能帮助你。在ruby 1.9中,哈希已经被排序了-BSON::OrderedHash只是hashnat的别名。我找到了另一个解决办法。希望它也能帮助你。