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

8 cách để bắt đầu một ngày trong MongoDB

Khi trích xuất ngày từ một ngày, tùy chọn chính xác mà chúng tôi sử dụng sẽ phụ thuộc vào cách chúng tôi muốn ngày được thể hiện.

Ví dụ, chúng ta muốn ngày trong tuần, ngày trong tháng hay ngày trong năm? Hoặc có lẽ chúng tôi muốn nó ở định dạng ISO 8601? Giá trị trả về thường sẽ khác nhau tùy thuộc vào việc chúng ta chọn cái nào.

Bài viết này khám phá các tùy chọn đó và do đó trình bày 8 cách để trả lại phần ngày 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 đây cho thấy các tùy chọn khác nhau để trả lại phần ngày từ born trường của các tài liệu đó.

$dayOfWeek Nhà điều hành

Như tên của nó, $dayOfWeek toán tử trả về ngày trong tuần kể từ một ngày.

Chúng ta có thể chạy mã sau để trả về ngày trong tuần từ born trong tài liệu trên.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" }
        }
    }
  ]
)

Kết quả:

{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 5 }

Cũng có thể chỉ định múi giờ khi sử dụng $dayOfWeek nhà điều hành.

Xem MongoDB $dayOfWeek để biết thêm thông tin và ví dụ.

$dayOfMonth Nhà điều hành

$dayOfMonth toán tử trả về ngày trong tháng kể từ một ngày.

Ví dụ:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfMonth: { $dayOfMonth: "$born" }
        }
    }
  ]
)

Kết quả:

{ "birthDayOfMonth" : 3 }
{ "birthDayOfMonth" : 8 }
{ "birthDayOfMonth" : 24 }

Bạn cũng có thể chỉ định múi giờ khi sử dụng $dayOfMonth nhà điều hành.

Xem MongoDB $dayOfMonth để biết thêm thông tin và ví dụ.

$dayOfYear Nhà điều hành

Đúng, bạn đoán nó. $dayOfYear toán tử trả về ngày trong năm từ một ngày.

Ví dụ:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfYear: { $dayOfYear: "$born" }
        }
    }
  ]
)

Kết quả:

{ "birthDayOfYear" : 3 }
{ "birthDayOfYear" : 342 }
{ "birthDayOfYear" : 268 }

$dayOfYear toán tử cũng chấp nhận một tham số múi giờ.

Xem MongoDB $dayOfYear để 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 ngày được trả lại nếu được yêu cầu.

Có các mã định dạng cho mỗi phần ngày và khi nói đến phần ngày, bạn có một lựa chọn các mã định dạng sẽ tùy thuộc vào việc bạn muốn trả lại ngày trong tuần, ngày trong tháng, ngày trong năm hay ngày trong tuần ở định dạng ISO 8601.

Ví dụ:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
          birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
          birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
          birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
       }
     }
   ]
).pretty()

Kết quả:

{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "03",
	"birthDayOfYear" : "003",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "08",
	"birthDayOfYear" : "342",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "5",
	"birthDayOfMonth" : "24",
	"birthDayOfYear" : "268",
	"birthDayOfWeekISO" : "4"
}

Chúng tôi có thể đã cung cấp nhiều mã định dạng hơn để đưa các phần ngày khác vào kết quả, nhưng vì chúng tôi chỉ quan tâm đến việc trích xuất ngày trong bài viết này, nên chúng tôi chỉ sử dụng các mã định dạng để trả về phần ngày.

Xem MongoDB $dateToString để biết thêm thông tin và ví dụ.

Cũng xem MongoDB $dateToString Các mã định dạng cho danh sách các mã định dạng mà bạn có thể sử dụng với $dateToString .

$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 day một phần nếu được yêu cầu.

Đâ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 quy trình để trích xuất chỉ trong day 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 day lĩnh vực:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthDay: "$dateParts.day"
        }
    }
  ]
)

Kết quả:

{ "birthDay" : 3 }
{ "birthDay" : 8 }
{ "birthDay" : 24 }

Đ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 tùy chọn.

Cũng cần nhắc lại rằng $dateToParts chấp nhận 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 qua con trỏ, sử dụng phương pháp JavaScript để chỉ trả về giá trị ngày.

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getDay()
      );
  }
);

Kết quả:

1
0
4

Trong trường hợp này, chúng tôi sử dụng JavaScript getDay() , trả về một số nguyên, từ 0 đến 6, tương ứng với ngày trong tuần của ngày nhất định, theo giờ địa phương.

Một tùy chọn khác là sử dụng getUTCDay() phương pháp sử dụng thời gian phổ quát. Chúng tôi sẽ sử dụng phương pháp này trong ví dụ tiếp theo.

Ngoài ra, chúng tôi có thể đã sử dụng JavaScript getDate() , trả về một số nguyên, từ 1 đến 31, đại diện cho ngày trong tháng cho ngày đã cho.

Ngoài ra, tùy chọn này chỉ trả về giá trị ngày thực tế chứ không phải toàn bộ tài liệu, như trong các ví dụ trước.

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.getUTCDay();
    return c;
  }
);

Kết quả:

[ 0, 0, 4 ]

Như đã đề cập, JavaScript getUTCDay() phương thức trả về kết quả của nó bằng cách sử dụng thời gian phổ quát. Trong trường hợp này, nó dẫn đến một giá trị khác được trả về cho tài liệu đầu tiên (chúng tôi nhận được 0 trong ví dụ này, so với 1 ở phần trước).

$isoDayOfWeek Nhà điều hành

Nếu bạn cần trả lại ngày trong tuần ở định dạng ISO 8601, bạn có thể sử dụng $isoDayOfWeek . 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,
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Kết quả:

{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 4 }

Trong trường hợp này, chúng tôi nhận được kết quả hoàn toàn khác với kết quả nhận được khi sử dụng $dayOfWeek toán tử, do cách ISO 8601 tính toán ngày tháng.

Dưới đây là một ví dụ minh chứng cho sự khác biệt này:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" },
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Kết quả:

{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB findOneAndUpdate ()

  2. Làm cách nào để xuất bộ sưu tập sang CSV trong MongoDB?

  3. Định cấu hình cảnh báo trên chỉ số MongoDB

  4. Sao lưu cơ sở dữ liệu MongoDB bằng mongodump

  5. Hiệu suất MongoDB - có nhiều cơ sở dữ liệu