MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB $ isoWeekYear

Trong MongoDB, $isoWeekYear nhà điều hành đường ống tổng hợp trả về năm đánh số theo tuần ISO cho một giá trị ngày nhất định. Đây là số năm ở định dạng ISO 8601.

Khi sử dụng $isoWeekYear , bạn có thể tùy chọn chỉ định múi giờ để sử dụng cho kết quả.

$isoWeekYear toán tử chấp nhận một ngày (dưới dạng Ngày, Dấu thời gian hoặc ObjectId) hoặc tài liệu chỉ định ngày và múi giờ để sử dụng.

Ví dụ

Giả sử chúng ta có một bộ sưu tập có tên là cats với tài liệu sau:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Chúng tôi có thể chạy mã sau để trích xuất năm ISO từ born trong tài liệu đó.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoWeekYear: { $isoWeekYear: "$born" }
        }
    }
  ]
)

Kết quả:

{ "birthIsoWeekYear" : NumberLong(2020) } 

Chúng ta có thể thấy rằng năm ISO thực tế là năm 2020, mặc dù ngày đó chỉ định năm 2021. Điều này là do năm ISO sẽ không kết thúc cho đến khi tuần cuối cùng kết thúc. Và trong trường hợp này, tuần bắt đầu vào cuối năm trước, và vẫn chưa kết thúc. Đây là cách hoạt động của các năm ISO.

Ở đây, tôi đã sử dụng birthIsoWeekYear làm tên trường để trả về, nhưng đây có thể là bất kỳ thứ gì (chẳng hạn như isoWeekYear , isoYear , vân vân).

_id trường được trả về theo mặc định khi sử dụng phép chiếu trong MongoDB, nhưng trong ví dụ này, tôi đã ẩn _id một cách rõ ràng trường sử dụng _id: 0 .

Chỉ định múi giờ

Bạn có thể chỉ định múi giờ để sử dụng cho đầu ra của $isoWeekYear nhà điều hành.

Khi bạn thực hiện việc này, đối số được chuyển đến $isoWeekYear phải có dạng sau:

{ date: <dateExpression>, timezone: <tzExpression> }

Ở đâu <dateExpression> là ngày sử dụng và <tzExpression> là múi giờ để sử dụng.

Múi giờ có thể được chỉ định bằng cách sử dụng định danh múi giờ Olson (ví dụ:"Europe/London" , "GMT" ) hoặc bù UTC (ví dụ:"+02:30" , "-1030" ).

Mã định danh múi giờ Olson

Dưới đây là một ví dụ xuất ra năm ISO ở hai múi giờ khác nhau, mỗi múi giờ sử dụng ID múi giờ Olson:

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          honolulu: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
)

Kết quả:

{ "honolulu" : NumberLong(2020), "auckland" : NumberLong(2021) } 

Trong trường hợp này, ngày chuyển sang năm ISO tiếp theo khi sử dụng Pacific/Auckland múi giờ.

Chênh lệch UTC

Dưới đây là ví dụ tương tự, ngoại trừ lần này chúng tôi sử dụng chênh lệch UTC.

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset-1000": { 
            $isoWeekYear: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeekYear: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Kết quả:

{ "utcOffset-1000" : NumberLong(2020), "utcOffset+1200" : NumberLong(2021) } 

Trả lại Năm ISO từ ObjectId

Bạn có thể sử dụng $isoWeekYear để trả lại phần năm ISO từ ObjectId.

Giá trị ObjectId là các giá trị thập lục phân 12 byte bao gồm:

  • Giá trị dấu thời gian 4 byte, đại diện cho việc tạo ObjectId, được đo bằng giây kể từ kỷ nguyên Unix.
  • Một 5 byte là một giá trị ngẫu nhiên
  • Bộ đếm tăng 3 byte, được khởi tạo thành giá trị ngẫu nhiên.

Tóm lại, tài liệu của chúng tôi trông giống như sau:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Tài liệu này chứa một ObjectId. Do đó, chúng tôi có thể sử dụng $isoWeekYear để trả về năm ISO mà tài liệu của chúng tôi đã được tạo (hoặc cụ thể hơn, khi _id giá trị ObjectId của trường đã được tạo).

Ví dụ:

db.cats.aggregate(
  [
    {
      $project:
        {
          "timeStamp": { $toDate: "$_id"},
          "isoWeekYear": { $isoWeekYear: "$_id" }
        }
    }
  ]
).pretty()

Kết quả:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"timeStamp" : ISODate("2021-01-21T00:24:05Z"),
	"isoWeekYear" : NumberLong(2021)
}

Chúng ta có thể thấy rằng tài liệu được tạo vào năm ISO 2021.

Trong trường hợp này, tôi cũng đã sử dụng $toDate toán tử đường ống tổng hợp để trả về phần dấu thời gian của ObjectId.

Giới thiệu về Hệ thống ngày theo tuần ISO

Hệ thống ngày theo tuần ISO là một hệ thống lịch nằm trong tiêu chuẩn ngày và giờ ISO 8601 do Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) ban hành. Hệ thống chỉ định một năm trong tuần trên lịch Gregory bằng cách xác định ký hiệu cho các tuần thứ tự trong năm.

Các năm đánh số theo tuần của ISO có 52 hoặc 53 tuần đầy đủ. Điều này có nghĩa là có 364 hoặc 371 ngày trong năm, thay vì 365 hoặc 366 ngày thông thường.

Các tuần ISO bắt đầu từ Thứ Hai. Mỗi năm của tuần ISO là năm Gregorian trong đó Thứ Năm rơi vào. Số tuần ISO bắt đầu từ 1 với tuần có thứ Năm đầu tiên của năm.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lợi thế của việc sử dụng ObjectId thay vì một Chuỗi đơn giản là gì?

  2. MongoDB $ concat

  3. MongoDB đối phó với các bản cập nhật đồng thời như thế nào?

  4. Số lượng MongoDB

  5. Hiểu và quản lý dung lượng đĩa trên máy chủ MongoDB của bạn