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

5 cách để có được một giờ cho một buổi hẹn hò trong MongoDB

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 , secondmillisecond .

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() .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. xử lý @ trong chuỗi kết nối mongodb

  2. Đưa ra một danh sách các id, cách tốt nhất để truy vấn những id nào không tồn tại trong bộ sưu tập là gì?

  3. Truy vấn MongoDB $ in với mảng phần tử regex

  4. Điều kiện truy vấn MongoDb khi so sánh 2 trường

  5. Giới thiệu về Morphia - Java ODM cho MongoDB