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

MongoDB $ tuần

Trong MongoDB, $week toán tử đường ống tổng hợp trả về tuần trong năm cho một ngày dưới dạng một số giữa 053 .

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

$week 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à pets với tài liệu sau:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Chúng ta có thể chạy mã sau để trả về tuần trong năm từ born trong tài liệu đó.

db.pets.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthWeek: { $week: "$born" }
        }
    }
  ]
)

Kết quả:

{ "birthWeek" : 52 } 

Chúng ta có thể thấy rằng tuần là 52.

Ở đây, tôi đã sử dụng birthWeek là tên trường để trả về, nhưng đây có thể là bất kỳ thứ gì (chẳng hạn như weekBorn , week , 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 $week nhà điều hành.

Khi bạn thực hiện việc này, đối số được chuyển đến $week 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 tuần ở hai múi giờ khác nhau, mỗi múi giờ sử dụng ID múi giờ Olson:

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

Kết quả:

{ "honolulu" : 52, "auckland" : 0 } 

Trong trường hợp này, ngày chuyển sang năm / tuần 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 bù UTC.

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

Kết quả:

{ "utcOffset-1000" : 52, "utcOffset+1200" : 0 } 

Trả lại Tuần từ ObjectId

Bạn có thể sử dụng $week để trả lại phần trong tuần 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("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

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

Ví dụ:

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

Kết quả:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timeStamp" : ISODate("2021-01-19T01:11:35Z"),
	"week" : 3
}

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

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.

Tuần lễ ISO

Bạn cũng có thể sử dụng $isoWeek toán tử để trả về số tuần ở định dạng ISO 8601, từ 1 thành 53 .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để định cấu hình một cụm MongoDB hỗ trợ các phiên?

  2. Sao chép một bộ sưu tập trong MongoDB

  3. Làm thế nào để xem các trường tài liệu trong mongo shell?

  4. Cuộc chiến của các cơ sở dữ liệu NoSQL - So sánh MongoDB và Firebase

  5. Mẹo để chạy MongoDB trong sản xuất bằng cách sử dụng các luồng thay đổi