在Mongoid中,日期(Date)、时间(Time)、日期时间(DateTime)和时区时间(TimeWithZone)字段类型有什么区别?

18
文档提到了四种与时间相关的字段类型(http://mongoid.org/en/mongoid/docs/documents.html#fields)。在其他数据库中,我可以看出这些字段在数据库中将是不同的类型,但对于MongoDB,它们不都将是日期类型吗?这只是为了与ActiveRecord保持一致性吗?
1个回答

11

它们之间几乎没有区别,它们都包装了时间类型。 您可以更改DateTime、Date或TimeWithZone,在从Mongo反序列化后获取这些类型的实例。

Mongoid扩展了这些类,以添加demongoize/mongoize方法进行数据绑定。因此唯一的区别在于实现方式。

所以时间的实现

def demongoize(object)
  return nil if object.blank?
  object = object.getlocal unless Mongoid::Config.use_utc?
  if Mongoid::Config.use_activesupport_time_zone?
    object = object.in_time_zone(Mongoid.time_zone)
  end
  object
end

def mongoize(object)
  return nil if object.blank?
  begin
    time = object.__mongoize_time__
    if object.respond_to?(:sec_fraction)
      ::Time.at(time.to_i, object.sec_fraction * 10**6).utc
    elsif time.respond_to?(:subsec)
      ::Time.at(time.to_i, time.subsec * 10**6).utc
    else
      ::Time.at(time.to_i, time.usec).utc
    end
  rescue ArgumentError
    EPOCH
  end
end

日期实现

def demongoize(object)
  ::Date.new(object.year, object.month, object.day) if object
end


def mongoize(object)
  unless object.blank?
    begin
      time = object.__mongoize_time__
      ::Time.utc(time.year, time.month, time.day)
    rescue ArgumentError
      EPOCH
    end
  end
end

您可以检查其他的实现方式

https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/date.rb#L46 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/date_time.rb#L49 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/time.rb#L48 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/time_with_zone.rb#L32

更新:

抱歉,链接已过时,因为它们指向主分支。


只是一个警告:我观察到rspec测试中的一个奇怪的bug,其中对DateTime字段的断言有时会因为毫秒差异而失败。在断言之前系统地重新加载对象或使用Time类型时,我没有这个问题。 - Cyril Duchon-Doris
1
这个答案在 Mongoid 6.2 中是不正确的。Mongoid 的 Time 数据类型用于存储 ActiveSupport::TimeWithZone,而 DateTime 是纯 Ruby 的 DateTime。这两者之间有重要的区别。 - skalee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接