该文档提到了四种与时间相关的字段类型(http://mongoid.org/en/mongoid/docs/documents.html#fields).在其他数据库中,我可以看到这些字段将如何成为数据库中的差异类型,但对于MongoDB而言,它们都不是日期类型?这只是为了与ActiveRecord保持一致吗?
它们之间几乎没有区别,它们都包含时间类型.您可以更改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