Trong MongoDB, $dateToString
toán tử đường ống tổng hợp chuyển đổi một đối tượng ngày tháng nhất định thành một chuỗi.
$dateToString
toán tử chấp nhận Ngày, Dấu thời gian hoặc ObjectId.
Bạn có thể chỉ định một định dạng để sử dụng cho kết quả bằng cách cung cấp một đặc tả định dạng. Đặc tả định dạng có thể là bất kỳ chuỗi ký tự nào, chứa 0 hoặc nhiều ký hiệu định dạng.
Đặc tả định dạng là tùy chọn từ MongoDB phiên bản 4.0, khi featureCompatibilityVersion
được đặt thành 4.0
hoặc cao hơn. Các phiên bản trước yêu cầu đặc tả định dạng.
Bạn có thể tùy chọn sử dụng timezone
tham số để chỉ định múi giờ sẽ sử dụng.
Bạn cũng có thể sử dụng onNull
tham số để chỉ định những gì sẽ trả về nếu ngày null
hoặc bị thiếu.
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ả về một chuỗi ngày tháng từ born
trong tài liệu đó.
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
}
}
]
)
Kết quả:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Ví dụ này sử dụng %Y-%m-%dT%H:%M:%S.%LZ
như đặc tả định dạng. Đây là đặc điểm kỹ thuật định dạng mặc định, nhưng trong trường hợp này, chúng tôi đã chỉ định nó một cách rõ ràng. Chúng ta có thể thấy rằng chuỗi ngày được trả về bằng định dạng được chỉ định.
Ở đây, tôi đã sử dụng dateString
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ư formattedDate
, theDate
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
.
Xem MongoDB $dateToString
Mã định dạng cho danh sách các mã định dạng có sẵn.
Đầu ra mặc định
Như đã đề cập, đặc tả định dạng trong ví dụ trước là đặc tả định dạng mặc định.
Nếu bạn đang sử dụng MongoDB phiên bản 4.0 trở lên, với featureCompatibilityVersion
đặt thành 4.0
hoặc cao hơn (xem cách xem featureCompatibilityVersion
hiện tại của bạn và cách đặt nó), bạn có thể bỏ qua đặc tả định dạng nếu bạn muốn định dạng ngày bằng định dạng trên.
Do đó, chúng tôi có thể viết lại phần trước. ví dụ cho điều này:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
Kết quả:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Chỉ định múi giờ
Bạn có thể chỉ định múi giờ để sử dụng cho đầu ra của $dateToString
nhà điều hành.
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 chuỗi ngày theo ba 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,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
}
}
]
).pretty()
Kết quả:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T12:30" }
Chênh lệch UTC
Dưới đây là một ví dụ sử dụng độ lệch UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
}
}
]
).pretty()
Kết quả:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T11:30" }
Định dạng ngày theo tuần ISO
Có một số thông số định dạng cho phép bạn xuất chuỗi ngày bằng định dạng ISO 8601.
Đặc biệt, bạn có thể sử dụng:
Định dạng chỉ định | Đầu ra |
---|---|
%G | Năm ở định dạng ISO 8601 |
%u | Số ngày trong tuần ở định dạng ISO 8601 (1-Thứ Hai, 7-Chủ Nhật) |
%V | Tuần trong năm ở định dạng ISO 8601 |
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 các trường ngày ISO từ born
trong tài liệu đó.
Dưới đây là một ví dụ để chứng minh:
db.cats.aggregate(
[
{
$project: {
_id: 0,
isoYear: { $dateToString: { format: "%G", date: "$born" } },
isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
}
}
]
)
Kết quả:
{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }
Ngược lại, bên dưới là cùng một ví dụ, nhưng sử dụng các phần ngày trong tuần không phải ISO.
db.cats.aggregate(
[
{
$project: {
_id: 0,
year: { $dateToString: { format: "%Y", date: "$born" } },
dayofweek: { $dateToString: { format: "%w", date: "$born" } },
weekofyear: { $dateToString: { format: "%U", date: "$born" } }
}
}
]
)
Kết quả:
{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }
Chúng ta có thể thấy rằng kết quả là hoàn toàn khác nhau.
onNull
Tham số
onNull
tham số có thể được sử dụng để chỉ định những gì sẽ trả về nếu ngày tháng trống hoặc không tồn tại.
Giá trị được cung cấp cho onNull
tham số có thể là bất kỳ biểu thức hợp lệ nào.
Đây là một ví dụ:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
Kết quả:
{ "dateString" : "No date supplied" }
Trong trường hợp này, ngày null
và do đó, tài liệu đầu ra bao gồm chuỗi mà tôi đã cung cấp cho onNull
tham số.
Trả lại các phần ngày từ ObjectId
Bạn có thể sử dụng $dateToString
để trả về một chuỗi ngày tháng từ mộ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 đầu tiên 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 $dateToString
để trả về một chuỗi ngày, dựa trên ngày 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" },
dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
}
}
]
).pretty()
Kết quả:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" : ISODate("2021-01-19T01:11:35Z"), "dateString" : "19-01-2021" }
Trong trường hợp này, tôi quyết định chỉ trả lại phần ngày (không phải phần thời gian). Tôi cũng đã thay đổi thứ tự ngày, tháng và năm để chứng minh rằng bạn chắc chắn có thể làm điều này nếu được yêu cầu.
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.