MongoDB cung cấp khá nhiều toán tử đường ống tổng hợp để làm việc với ngày tháng. Điều này bao gồm các toán tử trích xuất các phần nhất định của ngày, chẳng hạn như năm, tháng, ngày, 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 đó, điều này cho phép bạn 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.
Bài viết này trình bày 6 cách để trả lại phần năm từ một ngày 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 minh họa các tùy chọn khác nhau để trả về phần năm từ born
lĩnh vực của các tài liệu đó.
$year
Nhà điều hành
$year
toán tử là lựa chọn rõ ràng nhất để trích xuất phần năm từ một ngày. Nó được thiết kế đặc biệt để trả về một tài liệu có phần năm của ngày.
Chúng ta có thể chạy đoạn mã sau để trả về năm từ born
trong tài liệu trên.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthYear: { $year: "$born" }
}
}
]
)
Kết quả:
{ "birthYear" : 2021 } { "birthYear" : 2019 } { "birthYear" : 2020 }
Bạn cũng có thể chỉ định múi giờ khi sử dụng $year
nhà điều hành.
Xem MongoDB $year
để 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 năm đượ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. %Y
định dạng định dạng trả về năm.
Ví dụ:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthYear: { $dateToString: { format: "%Y", date: "$born" } }
}
}
]
)
Kết quả:
{ "birthYear" : "2021" } { "birthYear" : "2019" } { "birthYear" : "2020" }
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 năm 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
.
Được trang bị kiến thức này, chúng ta 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 year
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 } }
Dữ liệu này có thể được chuyển sang giai đoạn tiếp theo trong đường dẫn để chỉ trích xuất year
trường.
Đây là những gì sẽ xảy ra nếu chúng tôi thêm một dự báo khác chỉ cho year
lĩnh vực:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthYear: "$dateParts.year"
}
}
]
)
Kết quả:
{ "birthYear" : 2021 } { "birthYear" : 2019 } { "birthYear" : 2020 }
Điều này rõ ràng là không ngắn gọn như sử dụng các tùy chọn trước đó. Tuy nhiên, tùy thuộc vào những gì bạn đang làm trong quy trình của mình, phương pháp này có thể là một lựa chọn hữu ích.
$dateToParts
toán tử cũng chấp nhận một iso8601
tham số này sửa đổi tài liệu đầu ra để sử dụng các trường ngày theo tuần ISO.
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 lại qua con trỏ, sử dụng phương thức JavaScript như getFullYear()
hoặc getUTCFullYear()
để chỉ trả về giá trị năm.
db.cats.find().forEach(
function(c) {
print(
c.born.getFullYear()
);
}
);
Kết quả:
2021 2019 2020
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ị. Tùy chọn này chỉ trả về giá trị năm 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.getFullYear();
return c;
}
);
Kết quả:
[ 2021, 2019, 2020 ]
$isoWeekYear
Nhà điều hành
Nếu bạn cần trả lại năm ở định dạng ISO 8601, hãy sử dụng $isoWeekYear
. Năm ISO 8601 bắt đầu từ Thứ Hai của tuần 1 và kết thúc vào Chủ Nhật của tuần trước.
Ví dụ:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeekYear: { $isoWeekYear: "$born" }
}
}
]
)
Kết quả:
{ "birthIsoWeekYear" : NumberLong(2020) } { "birthIsoWeekYear" : NumberLong(2019) } { "birthIsoWeekYear" : NumberLong(2020) }
Lưu ý rằng năm đầu tiên bây giờ là năm 2020 thay vì năm 2021 như trong các ví dụ trước. Không phải tất cả các năm đều khác nhau khi sử dụng $isoWeekYear
, vì nó phụ thuộc vào ngày được đề cập.