MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB $ dateToString

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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Nhóm MongoDB theo các giá trị trong một trường mảng

  2. Làm thế nào để giải quyết ClassNotFoundException:com.mongodb.connection.BufferProvider?

  3. Những điều cần biết khi bắt đầu làm việc với MongoDB trong sản xuất - Mười lời khuyên

  4. Làm cách nào để tăng tốc độ Chèn MongoDB / giây?

  5. Dấu chấm MongoDB (.) Trong tên khóa