Tài liệu đề cập đến bốn loại loại trường liên quan đến thời gian (http://mongoid.org/en/mongoid/docs/documents.html#fields). Trong các cơ sở dữ liệu khác, tôi có thể thấy các trường này sẽ là các kiểu khác nhau trong cơ sở dữ liệu như thế nào nhưng đối với MongoDB, chúng không phải là tất cả các kiểu Date? Đây có phải là sự nhất quán với ActiveRecord không?Trong Mongoid, có bất kỳ sự khác biệt nào trong các kiểu trường Ngày, Thời gian, Ngày giờ và Thời gian không?
Trả lời
Có hầu như không có sự khác biệt giữa chúng, tất cả chúng đều bao gồm kiểu Thời gian. Bạn có thể thay đổi DateTime, Date hoặc TimeWithZone để nhận các thể hiện của các kiểu này sau khi unserializing từ mongo.
Mongoid mở rộng lớp này để thêm các phương pháp demongoize/mongoize cho ràng buộc dữ liệu. Vì vậy, sự khác biệt duy nhất là trong thực hiện.
Vì vậy, Thời gian thực hiện
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
ngày thi
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
Bạn có thể kiểm tra implemetations khác
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
- 1. Ngày và Thời gian trong các cột riêng biệt, chuyển đổi thành ngày giờ trong R
- 2. Ngày/Thời gian tối thiểu/ngày giờ trong JodaTime
- 3. chuyển đổi bất kỳ chuỗi ngày nào thành dấu thời gian không có múi giờ
- 4. MomentJS Ngày khác biệt ngày chỉ trừ thời gian
- 5. Trong Ruby on Rails, sự khác nhau giữa DateTime, Dấu thời gian, Thời gian và Ngày tháng là gì?
- 6. Thời gian ngày trong Groovy
- 7. Sự khác biệt dấu thời gian trong giờ cho PostgreSQL
- 8. Lấy ngày hiện tại và thời gian với [NSDate ngày] Thời gian ngày
- 9. Ngày giờ trong khoảng thời gian trong JodaTime?
- 10. Ruby có thể in ra sự khác biệt về thời gian (thời gian) không?
- 11. Ghi thời gian nhóm theo ngày, không theo thời gian
- 12. Thêm Thời gian vào một Ngày giờ trong C#
- 13. Chia thành các cột ngày và thời gian riêng biệt
- 14. Django - nhận các ngày riêng biệt từ dấu thời gian
- 15. Tách ngày và giữ nguyên thời gian
- 16. Trích xuất thời gian từ ngày giờ và xác định xem thời gian (không phải ngày) có nằm trong phạm vi không?
- 17. Cách chuyển đổi thời gian UTC thành Thời gian ở bất kỳ múi giờ nào khác trong C#
- 18. Sự khác biệt giữa MySql giữa hai dấu thời gian trong ngày?
- 19. Mongoid: Loại chuỗi thời gian?
- 20. Sự khác biệt giữa thời gian() và MongoDate mới()?
- 21. Loại ngày không có thời gian trong Oracle
- 22. Output ngày/thời gian trong PowerShell
- 23. CHỌN LỰA CHỌN Ngày giờ khớp với ngày (và không nhất thiết là thời gian)
- 24. Tính toán sự khác biệt giữa ngày/giờ trong PHP
- 25. Python Chuyển đổi Ngày Giờ thành Thời gian
- 26. Bạn có biết bất kỳ sự khác biệt thời gian chạy nào giữa mã Compact và Full Framework không?
- 27. sự khác biệt trong vài giây giữa hai ngày sử dụng thời gian joda?
- 28. Dấu thời gian Mysql và ngày php()
- 29. Sự khác nhau giữa hai chuỗi với thời gian và ngày trong tuần
- 30. Đối phó với ngày tháng và thời gian trong R
Chỉ là một cảnh báo: Tôi đã quan sát thấy một lỗi lạ trong các thử nghiệm rspec, trong đó các xác nhận trên các trường DateTime đôi khi sẽ thất bại do sự khác biệt mili giây. Tôi không có vấn đề này với các loại thời gian hoặc khi tải lại một cách có hệ thống một đối tượng trước khi xác nhận. –
Câu trả lời này không đúng trong Mongoid 6.2. Kiểu dữ liệu 'Time' của Mongoid phục vụ cho việc lưu trữ' ActiveSupport :: TimeWithZone', trong khi 'DateTime' là một Ruby' DateTime' thuần túy. Và có sự khác biệt quan trọng giữa hai điều này. – skalee