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

MongoDB $ dateToParts

Trong MongoDB, $dateToParts nhà điều hành đường ống tổng hợp trả về các phần ngày của một ngày nhất định.

Cụ thể hơn, nó trả về một tài liệu chứa các phần cấu thành của một giá trị Ngày BSON nhất định dưới dạng các thuộc tính riêng lẻ.

Các phần ngày được trả về bởi $dateToPartsyear , month , day , hour , minute , secondmillisecond .

Khi sử dụng $dateToParts , bạn có thể tùy chọn chỉ định múi giờ để sử dụng cho kết quả.

$dateToParts toán tử chấp nhận một ngày (dưới dạng Ngày, Dấu thời gian hoặc ObjectId) hoặc tài liệu chỉ định ngày và múi giờ để sử dụng.

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 tôi có thể chạy mã sau để trả về các phần ngày tháng khác nhau từ born trong tài liệu đó.

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

Kết quả:

{
	"dateParts" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Chúng ta có thể thấy rằng mỗi phần ngày tháng được trả về trong trường riêng của nó.

Ở đây, tôi đã sử dụng dateParts là tên trường để trả về, nhưng đây có thể là bất kỳ thứ gì (chẳng hạn như 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 .

Chỉ định múi giờ

Bạn có thể chỉ định múi giờ để sử dụng cho đầu ra của $dateToParts nhà điều hành.

Khi bạn thực hiện việc này, đối số được chuyển đến $dateToParts phải có dạng sau:

{ date: <dateExpression>, timezone: <tzExpression> }

Ở đâu <dateExpression> là ngày sử dụng và <tzExpression> là múi giờ để sử dụng.

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 ra các phần ngày ở hai 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,
          honolulu: { 
            $dateToParts: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $dateToParts: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
).pretty()

Kết quả:

{
	"honolulu" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 13,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"auckland" : {
		"year" : 2021,
		"month" : 1,
		"day" : 1,
		"hour" : 12,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Trong trường hợp này, ngày sẽ chuyển sang năm tiếp theo / tháng / tuần / ngày / giờ khi sử dụng Pacific/Auckland múi giờ.

Chênh lệch UTC

Dưới đây là ví dụ tương tự, ngoại trừ lần này chúng tôi sử dụng bù UTC.

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset-1000": { 
            $dateToParts: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $dateToParts: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
).pretty()

Kết quả:

{
	"utcOffset-1000" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 13,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"utcOffset+1200" : {
		"year" : 2021,
		"month" : 1,
		"day" : 1,
		"hour" : 11,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Phần ngày theo tuần ISO

Bạn có thể sử dụng iso8601: true để sửa đổi tài liệu đầu ra để sử dụng các trường ngày trong tuần ISO. Điều này dựa trên ngày theo tiêu chuẩn 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.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          dateParts: { 
            $dateToParts: { 
              date: "$born"
            }
          },
          datePartsISO: { 
            $dateToParts: { 
              date: "$born",
              iso8601: true
            }
          }
      }
    }
  ]
).pretty()

Kết quả:

{
	"dateParts" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"datePartsISO" : {
		"isoWeekYear" : 2020,
		"isoWeek" : 53,
		"isoDayOfWeek" : 4,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Tài liệu đầu ra đầu tiên sử dụng đầu ra ngày bình thường. Tài liệu thứ hai sử dụng các trường và giá trị trong tuần ISO.

Trả lại các phần ngày từ ObjectId

Bạn có thể sử dụng $dateToParts để trả về các phần ngày tháng 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 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 $dateToParts để trả lại các phần ngày tháng, dựa trên ngày 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"},
          "dateParts": { $dateToParts: { date: "$_id" } }
        }
    }
  ]
).pretty()

Kết quả:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timeStamp" : ISODate("2021-01-19T01:11:35Z"),
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 19,
		"hour" : 1,
		"minute" : 11,
		"second" : 35,
		"millisecond" : 0
	}
}

Trong trường hợp này, 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. Mongoose - RangeError:Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá

  2. Tự động hoàn thành với java, Redis, Tìm kiếm đàn hồi, Mongo

  3. Cách nhanh nhất để loại bỏ các tài liệu trùng lặp trong mongodb

  4. Phương thức Meteor so với quy tắc từ chối / cho phép

  5. Nhà điều hành đường ống tổng hợp MongoDB $ sum