Chỉ lưu ngày trong mongodb

P. S. Tôi đã không viết những ưu và nhược điểm vì câu trả lời của tôi là về cách lưu trữ ngày riêng biệt và rõ ràng là khi phương pháp này được sử dụng

Sau khi trò chuyện với SergiiStotskyi trong các bình luận bên dưới, tôi quyết định đưa ra những ưu và nhược điểm để cảnh báo các nhà phát triển chọn giải pháp tốt nhất

Hãy nhớ rằng phương pháp này có rất ít lợi ích

Ưu điểm (tôi chỉ có thể tìm thấy hai)

  1. các trường năm, tháng, ngày riêng biệt giúp lọc theo năm, tháng, ngày chính xác. Giống. tìm tất cả các bản ghi cho tháng Năm được nhóm theo Năm (để so sánh sự khác biệt giữa các tháng với các năm trước)
  2. so với Ngày nhạy cảm với múi giờ, năm, tháng, ngày không thay đổi theo múi giờ
  3. không chính xác, ngày có thể được lưu vì nó đến từ phía máy khách nếu mọi ngày của phần tử cũng riêng biệt

Nhược điểm

  1. Nếu cần lấy hồ sơ theo độ tuổi thì sẽ khó xác định, sẽ yêu cầu sử dụng xấp xỉ theo trường năm (trong trường hợp sử dụng của tôi là phù hợp nhất, vì không ai quan tâm đến con số chính xác trong dự án của tôi)
  2. Để lọc độ tuổi chính xác sẽ yêu cầu tổng hợp với kết hợp theo năm và giảm bằng cách lọc ra các mục trong phạm vi
  3. Cần xác thực năm nhuận

ghi bàn. 3

Hậu trường, buổi hẹn hò của cầy mangut giống như một

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
4 trong javascript. nó lưu trữ giờ, giây, v.v. Không có sự phân biệt với ngày/thời gian như trong SQL. Trong một xu, trong một bảng Anh. Điều đó đang được nói, nó chỉ là một vấn đề hiển thị

Lý do là mongo không hỗ trợ loại này. Bạn có thể tạo một đối tượng với các thuộc tính năm/tháng/ngày nhưng sẽ rất khó xử lý

trình điều khiển c # theo mặc định (không có cài đặt bổ sung) lưu ngày địa phương dưới dạng ngày utc vào cơ sở dữ liệu (bù múi giờ - ngày) nhưng đọc lại mà không có bất kỳ hành động nào (vì vậy, ngày utc)

Do đó, khi bạn tải ngày giờ từ cơ sở dữ liệu, bạn sẽ nhận được chênh lệch sau 2 giờ (bù múi giờ của bạn). Có hai cách tiếp cận để nói với trình điều khiển C# mongodb chuyển đổi ngày utc thành ngày múi giờ địa phương trong quá trình khử lưu huỳnh

1. thông qua các thuộc tính cho trường ngày cụ thể

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}

2. thông qua cài đặt chung cho tất cả các trường ngày giờ (mặc định là

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
5)

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;

Khi bạn thực hiện #1 hoặc #2, bạn sẽ thấy ngày địa phương

Cập nhật


# 2 đã lỗi thời trong phiên bản trình điều khiển mới nhất, vì vậy hãy sử dụng mã bên dưới để thay thế

BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));

Cập nhật


# 2 đã thay đổi một lần nữa

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);

Khi làm việc với ngày tháng trong MongoDB, bạn phải hết sức cẩn thận vì. MongoDB theo mặc định lưu trữ ngày & giờ trong đối tượng

db.test.insertOne({dob: new Date("1977-3-20")})
2 theo UTC/GMT. - không có bất kỳ dữ liệu múi giờ nào được thêm vào nó. Ý tưởng là - bạn chuyển đổi ngày theo múi giờ chính xác khi bạn truy vấn nó và hiển thị cho người dùng. Nếu bạn không làm điều đó - bạn sẽ có khoảng thời gian tồi tệ. Theo đúng nghĩa đen. . ) Ngày sinh không được chuyển đổi thành múi giờ địa phương mà phải được lưu dưới dạng UTC và được sử dụng làm UTC

lời nói đầu

Tôi bắt đầu viết tài liệu này như một lời nhắc nhở bản thân khi làm những thứ mongo

Trong khi làm việc với thông tin ngày giờ trong bất kỳ cơ sở dữ liệu điện tử nào và bất kỳ ngôn ngữ lập trình nào, nơi bạn sống và nơi khách hàng của bạn sinh sống sẽ quyết định rất nhiều đến cách bạn tiếp cận thời gian, ngày tháng và múi giờ nói chung trong khi học hoặc phát triển

Nếu bạn chỉ giao dịch với người dùng trong một múi giờ - rất có thể - bạn chưa bao giờ phải suy nghĩ đặc biệt về múi giờ nói chung. Bạn có thể gặp sự cố ánh sáng một hoặc hai lần một năm (ví dụ:. nếu bạn sống ở múi giờ tiết kiệm ánh sáng ban ngày thay đổi +/- 1 giờ nhiều lần trong một năm). Nhưng chủ yếu - bạn sẽ lưu trữ một số thời gian và ngày tháng và truy xuất chúng mà không gặp nhiều vấn đề

Bạn thậm chí có thể lưu thông tin ngày và giờ của mình trong cơ sở dữ liệu ở định dạng dấu thời gian UNIX - mà không có bất kỳ thông tin múi giờ nào được thêm hoặc đặt dưới dấu thời gian (dấu thời gian Unix luôn dựa trên UTC/GMT và vd. không tính đến giây nhuận)

Nếu bạn thực hiện hầu hết công việc lập trình phía máy chủ, trường hợp là ứng dụng & cơ sở dữ liệu của bạn đang hoạt động nội bộ với các ngày trong múi giờ của máy chủ của bạn. Nếu máy chủ của bạn nằm trong múi giờ của bạn - có thể bạn sẽ không nhận thấy bất cứ điều gì "tắt". Cho đến khi ánh sáng ban ngày tiết kiệm thời gian bắt đầu thay đổi và bạn bắt đầu nhận thấy trong các bản ghi cơ sở dữ liệu của mình có cùng dấu thời gian (khi chúng lặp lại)

Không có vấn đề gì nếu bạn nghĩ rằng không có gì sai với khái niệm này bởi vì nó "hầu hết hoạt động" đối với bạn, mọi thứ với khái niệm này quá nhiều đến nỗi tài liệu này thậm chí không thể nắm bắt được một phần nhỏ của vấn đề

Nếu ứng dụng của bạn có khách hàng từ nhiều múi giờ, phục vụ từ nhiều máy chủ từ nhiều trung tâm dữ liệu, thì việc bỏ qua các múi giờ sẽ không hiệu quả

Hãy lấy một ví dụ sau về Người dùng X đã làm Y ở Châu Âu/Zagreb vào ngày 31-12-2021 lúc 23. 00. 00 (CET/UTC +1)

  • chúng tôi lưu cái này vào DB trong UTC - vì vậy đối với sự kiện mongodb đã xảy ra vào - UTC 2021-12-31 22. 00. 00
  • trong khi truy xuất, chúng tôi áp dụng múi giờ
  • đối với người dùng ở Sydney/Úc, sự kiện đó diễn ra theo giờ địa phương của anh ấy lúc AEDT (UTC +11) Thứ bảy, ngày 1 tháng 1 năm 2022 20. 00
  • đối với một người dùng ở New York, NY, Hoa Kỳ, sự kiện đó đã xảy ra theo giờ địa phương của anh ấy lúc EST (UTC -5) Thứ Sáu, ngày 31 tháng 12 năm 2021 17. 00

Nhưng những gì về ngày sinh bạn có thể yêu cầu? . Bạn ofc cần một bản gốc. Nhưng ngày được lưu ở dạng UTC và bạn đang ở New York và bạn không biết người dùng đó sinh ra ở đâu trên Trái đất cũng như ở múi giờ nào

tài liệu mongodb

Ngày()

https. // tài liệu. mongodb. com/manual/reference/method/Date/ https. // tài liệu. mongodb. com/manual/tutorial/model-iot-data/

Bạn có thể chỉ định một ngày cụ thể bằng cách chuyển một chuỗi ngày theo tiêu chuẩn ISO-8601 với một năm trong phạm vi bao gồm từ 0 đến 9999 tới hàm tạo Date() mới hoặc hàm ISODate(). Các chức năng này chấp nhận các định dạng sau

  • db.test.insertOne({dob: new Date("1977-3-20")})
    
    3 trả về
    db.test.insertOne({dob: new Date("1977-3-20")})
    
    2 với ngày được chỉ định
  • db.test.insertOne({dob: new Date("1977-3-20")})
    
    5 chỉ định ngày giờ theo múi giờ địa phương của khách hàng và trả về
    db.test.insertOne({dob: new Date("1977-3-20")})
    
    2 với ngày giờ đã chỉ định theo UTC
  • db.test.insertOne({dob: new Date("1977-3-20")})
    
    7 chỉ định ngày giờ trong UTC và trả về
    db.test.insertOne({dob: new Date("1977-3-20")})
    
    2 với ngày giờ được chỉ định trong UTC
  • db.test.insertOne({dob: new Date("1977-3-20")})
    
    9 chỉ định ngày giờ là mili giây kể từ kỷ nguyên UNIX (ngày 1 tháng 1 năm 1970) và trả về kết quả là phiên bản
    db.test.insertOne({dob: new Date("1977-3-20")})
    
    2

Hành vi

Bên trong, các đối tượng Date được lưu trữ dưới dạng số nguyên 64 bit đã ký biểu thị số mili giây kể từ kỷ nguyên Unix (ngày 1 tháng 1 năm 1970)

Không phải tất cả các hoạt động và trình điều khiển cơ sở dữ liệu đều hỗ trợ phạm vi 64 bit đầy đủ. Bạn có thể làm việc an toàn với ngày có năm trong phạm vi bao gồm từ 0 đến 9999

Lưu trữ cả UTC và múi giờ của người dùng

Trong MongoDB, bạn có thể lưu trữ cả ngày hiện tại và phần bù của máy khách hiện tại từ UTC

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
3

Bạn có thể tạo lại giờ địa phương ban đầu bằng cách áp dụng phần bù đã lưu

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
4

Lưu trữ ngày và giờ dưới dạng đối tượng JavaScript DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance; 51

Khi chèn ngày & giờ làm đối tượng

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
51, mà không chỉ định độ lệch múi giờ (Z), nếu ngày bạn đã chỉ định nằm trong khoảng thời gian tiết kiệm ánh sáng ban ngày - giờ được trừ/thêm vào để tạo UTC buộc ngày của bạn phải vào ngày trước đó

db.test.insertOne({dob: new Date("1977-3-20")})
DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
5
DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
9
BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));
0

Bạn có thể chỉ định ngày UTC (chú ý Z) khi sử dụng đối tượng

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
51 hoặc sử dụng tất cả đối tượng
db.test.insertOne({dob: new Date("1977-3-20")})
2

BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));
3

Sẽ chèn

BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));
4

Lưu trữ ngày và giờ dưới dạng đối tượng db.test.insertOne({dob: new Date("1977-3-20")}) 2

BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));
6
BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));
7____140
DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
41

Một số lời khuyên

Ngày giờ truy vấn

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
42
DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
43

Hiển thị ngày không có thời gian trong MongoDB

Chuyển đổi một đối tượng ngày thành một chuỗi theo định dạng do người dùng chỉ định

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
44

Múi giờ chấp nhận

  • Mã định danh múi giờ Olson "America/New_York" "Châu Âu/London" "GMT"

  • Độ lệch UTC +/-[hh]. [mm], e. g. "+04. 45" +/-[hh][mm], e. g. "-0530" +/-[hh], e. g. "+03"

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
45

trả về - ngày UTC từ db và chuyển đổi thành UTC/GMT -5 giờ (24-5=19h) một ngày trước đó - 1977-03-19T19. 00. 00. 000Z

Làm cách nào để lưu một ngày trong MongoDB?

Bạn có thể chỉ định một ngày cụ thể bằng cách chuyển chuỗi ngày theo tiêu chuẩn ISO-8601 với một năm trong phạm vi bao gồm từ 0 đến 9999 cho hàm tạo Date() mới hoặc hàm ISODate() . Các chức năng này chấp nhận các định dạng sau. new Date(". These functions accept the following formats: new Date("") returns the ISODate with the specified date.

Chúng tôi có thể lưu trữ ngày trong MongoDB không?

MongoDB rất linh hoạt và cho phép bạn kết hợp và lưu trữ nhiều loại dữ liệu . Nó cũng lưu trữ và xử lý lượng dữ liệu lớn hơn cơ sở dữ liệu quan hệ truyền thống.

Làm cách nào để chỉ lưu trữ thời gian không có ngày trong MongoDB?

Bạn có thể lưu trữ thời gian dưới dạng số (số giây kể từ 00. 00. 00) . Nó sẽ được sắp xếp tự nhiên và dễ dàng chuyển đổi từ/sang hh. mm. định dạng ss khi cần thiết.

Làm thế nào để lưu ngày mà không có thời gian trong cầy mangut?

Bạn có thể thực hiện trong khoảng thời gian giữa các ngày. Sử dụng $gte cho phạm vi thấp hơn và $lt cho phạm vi cao hơn (là ngày tiếp theo) để không chọn ngày tiếp theo lúc 00. 00. 00 giờ.