Trong MongoDB, $isoDayOfWeek
toán tử đường ống tổng hợp trả về số ngày trong tuần ở định dạng ISO 8601, nằm trong khoảng từ 1
(cho Thứ Hai) đến 7
(dành cho chủ nhật).
Bạn có thể tùy ý chỉ định múi giờ để sử dụng cho kết quả.
$isoDayOfWeek
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 đoạn mã sau để trích xuất ngày ISO trong tuần từ born
trong tài liệu đó.
db.pets.aggregate(
[
{
$project:
{
_id: 0,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Kết quả:
{ "birthIsoDayOfWeek" : 4 }
Trong trường hợp này, chúng tôi nhận được kết quả là 4, đây là một kết quả khác với những gì tôi nhận được khi sử dụng $dayOfWeek
toán tử so với cùng một tài liệu.
Ở đây, tôi đã sử dụng birthIsoDayOfWeek
là tên trường cần trả về, nhưng đây có thể là bất kỳ thứ gì (chẳng hạn như isoDayOfWeek
, day
, 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 $isoDayOfWeek
nhà điều hành.
Khi bạn thực hiện việc này, đối số được chuyển đến $isoDayOfWeek
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ụ hiển thị ngày ở 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: {
$isoDayOfWeek: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$isoDayOfWeek: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Kết quả:
{ "honolulu" : 4, "auckland" : 5 }
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.pets.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$isoDayOfWeek: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$isoDayOfWeek: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Kết quả:
{ "utcOffset-1000" : 4, "utcOffset+1200" : 5 }
Trả lại Ngày trong tuần từ ObjectId
Bạn có thể sử dụng $isoDayOfWeek
để trả lại phần ngày trong tuần 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("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 $isoDayOfWeek
để trả về ngày ISO trong tuần 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.pets.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"isoDayOfWeek": { $isoDayOfWeek: "$_id" }
}
}
]
).pretty()
Kết quả:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timeStamp" : ISODate("2021-01-19T01:11:35Z"), "isoDayOfWeek" : 2 }
Chúng ta có thể thấy rằng tài liệu được tạo vào ngày thứ 2 trong tuần khi sử dụng định dạng ISO 8601.
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.