MongoDB cung cấp một loạt các toán tử tổng hợp để làm việc với ngày tháng, bao gồm các toán tử trích xuất các phần nhất định của ngày tháng, chẳng hạn như năm, tháng, ngày, giờ, phút, v.v.
Ngoài ra còn có một số phương thức MongoDB cho phép bạn lặp qua con trỏ và áp dụng một hàm JavaScript. Do đó, bạn có thể sử dụng JavaScript để trích xuất các giá trị ngày tháng và các phần ngày tháng, v.v. từ một trường theo yêu cầu.
Bài viết này trình bày 5 cách để trả về phần giờ từ đối tượng Date trong MongoDB.
Dữ liệu mẫu
Giả sử chúng ta có một bộ sưu tập có tên là cats
với các tài liệu sau:
{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") } { "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:12Z") } { "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:30:00Z") }
Các ví dụ sau đây cho thấy các tùy chọn khác nhau để trả lại phần giờ từ born
lĩnh vực của các tài liệu đó.
$hour
Nhà điều hành
$hour
toán tử được thiết kế đặc biệt để trả về tài liệu với phần giờ của một ngày nhất định.
Chúng ta có thể chạy đoạn mã sau để trả về phần giờ từ born
trong tài liệu trên.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthHour: { $hour: "$born" }
}
}
]
)
Kết quả:
{ "birthHour" : 23 } { "birthHour" : 4 } { "birthHour" : 10 }
Bạn cũng có thể chỉ định múi giờ khi sử dụng $hour
nhà điều hành.
Xem MongoDB $hour
để biết thêm thông tin và ví dụ.
$dateToString
Nhà điều hành
$dateToString
toán tử 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. Do đó, người dùng có thể chỉ định rằng chỉ phần giờ được trả lại nếu được yêu cầu.
Có các chỉ định định dạng cho từng phần ngày tháng. %H
định dạng định dạng trả về giờ.
Ví dụ:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthHour: { $dateToString: { format: "%H", date: "$born" } }
}
}
]
)
Kết quả:
{ "birthHour" : "23" } { "birthHour" : "04" } { "birthHour" : "10" }
Chúng tôi có thể đã cung cấp nhiều mã định dạng hơn để bao gồm các phần ngày trong kết quả, nhưng vì chúng tôi chỉ quan tâm đến việc trích xuất giờ trong bài viết này nên chúng tôi chỉ sử dụng một mã định dạng.
Xem MongoDB $dateToString
để biết thêm thông tin và ví dụ.
$dateToParts
Nhà điều hành
$dateToParts
toán tử trả về một tài liệu có chứa các phần cấu thành của một giá trị Ngày BSON đã cho dưới dạng các thuộc tính riêng lẻ. Các thuộc tính được trả về là year
, month
, day
, hour
, minute
, second
và millisecond
.
Do đó, chúng tôi có thể sử dụng $dateToParts
trong một giai đoạn đường ống, sau đó thêm một giai đoạn đường ống khác trích xuất hour
một phần.
Đây là những gì $dateToParts
trả lại cho ba tài liệu của chúng tôi:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Kết quả:
{ "dateParts" : { "year" : 2021, "month" : 1, "day" : 3, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } } { "dateParts" : { "year" : 2019, "month" : 12, "day" : 8, "hour" : 4, "minute" : 0, "second" : 12, "millisecond" : 0 } } { "dateParts" : { "year" : 2020, "month" : 9, "day" : 24, "hour" : 10, "minute" : 30, "second" : 0, "millisecond" : 0 } }
Sau đó, kết quả này có thể được chuyển sang giai đoạn tiếp theo trong đường dẫn để chỉ trích xuất hour
trường.
Đây là những gì sẽ xảy ra nếu chúng tôi thêm một phép chiếu khác chỉ cho hour
lĩnh vực:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthHour: "$dateParts.hour"
}
}
]
)
Kết quả:
{ "birthHour" : 23 } { "birthHour" : 4 } { "birthHour" : 10 }
Vấn đề ở đây là, nếu bạn sử dụng $dateToParts
trong quy trình của mình, bạn sẽ tự động có quyền truy cập vào phần giờ (và tất cả các phần khác) trong giai đoạn tiếp theo.
Xem MongoDB $dateToParts
để biết thêm thông tin và ví dụ.
forEach()
Phương pháp
Bạn có thể sử dụng cursor.forEach()
để lặp qua con trỏ, sử dụng phương thức JavaScript chẳng hạn như getHours()
hoặc getUTCHours()
để chỉ trả về giá trị giờ.
db.cats.find().forEach(
function(c) {
print(
c.born.getUTCHours()
);
}
);
Kết quả:
23 4 10
getUTCHours()
Phương thức JavaScript trả về một số nguyên, từ 0 đến 23, đại diện cho các giờ trong ngày cụ thể theo giờ quốc tế.
Bạn cũng có thể nhận thấy rằng các tùy chọn trước đó trả về toàn bộ tài liệu có chứa một cặp tên / giá trị, trong khi tùy chọn này chỉ trả về giá trị giờ thực chứ không phải toàn bộ tài liệu.
map()
Phương pháp
cursor.map()
phương thức áp dụng một hàm cho mỗi tài liệu được con trỏ truy cập và kết hợp các giá trị thành một mảng.
Ví dụ:
db.cats.find().map(
function(c) {
c = c.born.getHours();
return c;
}
);
Kết quả:
[ 9, 14, 20 ]
Bạn có thể nhận thấy rằng giờ kết quả khác với các ví dụ trước. Đó là vì trong ví dụ này, tôi đã sử dụng getHours()
Phương pháp JavaScript. Phương thức này trả về kết quả của nó theo thời gian cục bộ. Tôi có thể dễ dàng sử dụng getUTCHours()
.