Trong MongoDB, $dateFromParts
nhà điều hành kênh tổng hợp xây dựng và trả về đối tượng Ngày từ các phần cấu thành của ngày.
Bạn cung cấp từng phần ngày tháng như một trường riêng biệt.
Bạn có thể chỉ định các trường ngày cấu thành của mình ở định dạng ngày theo tuần ISO nếu được yêu cầu.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là dateParts
với tài liệu sau:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Tài liệu chứa một trường khác nhau cho mỗi phần ngày tháng.
Chúng ta có thể chạy đoạn mã sau để trả về một đối tượng ngày tháng từ các trường trong các tài liệu đó.
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
Kết quả:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
Tất cả các phần ngày / giờ đã được chuyển đổi thành một đối tượng ngày.
Múi giờ
Bạn có thể sử dụng timezone
trường để chỉ định múi giờ.
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ụ sử dụng ID múi giờ Olson để xuất ba ngày khác nhau từ một tài liệu, dựa trên ba múi giờ khác nhau.
db.dateParts.aggregate([
{
$project: {
dateUTC: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
},
dateHonolulu: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Honolulu"
}
},
dateAuckland: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
}
}
}]).pretty()
Kết quả:
{ "_id" : 1, "dateUTC" : ISODate("2020-12-31T10:30:25.123Z"), "dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"), "dateAuckland" : ISODate("2020-12-31T10:30:25.123Z") }
Chênh lệch UTC
Dưới đây là một ví dụ sử dụng độ lệch UTC.
db.dateParts.aggregate([
{
$project: {
"date+00:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+00:00"
}
},
"date-10:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "-10:00"
}
},
"date+12:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+12:00"
}
}
}
}]).pretty()
Kết quả:
{ "_id" : 1, "date+00:00" : ISODate("2020-12-31T23:30:25.123Z"), "date-10:00" : ISODate("2021-01-01T09:30:25.123Z"), "date+12:00" : ISODate("2020-12-31T11:30:25.123Z") }
Định dạng ngày theo tuần ISO
Các phần ngày tháng có thể được chỉ định bằng định dạng ISO 8601 nếu được yêu cầu.
Đặc biệt, bạn có thể sử dụng:
Định dạng chỉ định | Đầu ra |
---|---|
isoWeekYear | Năm ở định dạng ISO 8601. Trường này là bắt buộc nếu không sử dụng year (và year là bắt buộc nếu không sử dụng isoWeekYear ). |
isoWeek | Tuần trong năm ở định dạng ISO 8601. Chỉ có thể được sử dụng với isoWeekYear . |
isoDayOfWeek | Ngày trong tuần (1-Thứ Hai, 7-Chủ Nhật). Chỉ có thể được sử dụng với isoWeekYear . |
Giả sử chúng ta chèn một tài liệu thứ hai giống như sau:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
Chúng ta có thể thấy rằng nó sử dụng isoWeekYear
, isoWeek
và isoDayOfWeek
thay vì year
, month
và day
(là những gì tài liệu đầu tiên sử dụng).
Chúng ta có thể sử dụng mã sau để tạo đối tượng Ngày từ tài liệu này:
db.dateParts.aggregate([
{ $match: { _id: 2} },
{
$project: {
date: {
$dateFromParts: {
"isoWeekYear": "$isoWeekYear",
"isoWeek": "$isoWeek",
"isoDayOfWeek": "$isoDayOfWeek",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "$timezone"
}
}
}
}
])
Kết quả:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
Trường ngoài phạm vi
Bắt đầu từ MongoDB 4.4, phạm vi giá trị được hỗ trợ cho year
và isoWeekYear
là 1-9999
. Trong các phiên bản trước, giới hạn dưới cho các giá trị này là 0
và phạm vi giá trị được hỗ trợ là 0-9999
.
Bắt đầu trong MongoDB 4.0, nếu giá trị được chỉ định cho các trường khác với year
, isoWeekYear
và timezone
nằm ngoài phạm vi hợp lệ, $dateFromParts
toán tử mang hoặc trừ chênh lệch từ các phần ngày khác để tính ngày.
Giá trị cao hơn phạm vi
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Nhiều trường ngày và giờ trong tài liệu này cao hơn phạm vi hợp lệ tương ứng của chúng.
Hãy chạy lệnh sau để chuyển đổi nó thành đối tượng Ngày:
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Kết quả:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
Chúng ta có thể thấy rằng các phần ngày tháng trong đối tượng Ngày kết quả khác với các phần ngày tháng tương ứng của chúng trong tài liệu. Điều này là do $dateFromParts
đã tính toán lại ngày để tính cho các giá trị của phần ngày vượt quá phạm vi bình thường của chúng.
Giá trị thấp hơn phạm vi
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Nhiều trường ngày và giờ trong tài liệu này thấp hơn phạm vi hợp lệ tương ứng của chúng.
Hãy chạy lệnh sau để chuyển đổi nó thành đối tượng Ngày:
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Kết quả:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }