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

MongoDB $ dateFromParts

Trong MongoDB, $dateFromParts nhà điều hành kênh tổng hợp xây dựng và trả về đối tượng Ngày từ các phần cấu thành của ngày.

Bạn cung cấp từng phần ngày tháng như một trường riêng biệt.

Bạn có thể chỉ định các trường ngày cấu thành của mình ở định dạng ngày theo tuần ISO nếu được yêu cầu.

Ví dụ

Giả sử chúng ta có một bộ sưu tập được gọi là dateParts với tài liệu sau:

{
	"_id" : 1,
	"year" : 2020,
	"month" : 12,
	"day" : 31,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123
}

Tài liệu chứa một trường khác nhau cho mỗi phần ngày tháng.

Chúng ta có thể chạy đoạn mã sau để trả về một đối tượng ngày tháng từ các trường trong các tài liệu đó.

db.dateParts.aggregate([
{
   $project: {
      date: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond"
         }
      }
   }
}])

Kết quả:

{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }

Tất cả các phần ngày / giờ đã được chuyển đổi thành một đối tượng ngày.

Múi giờ

Bạn có thể sử dụng timezone trường để chỉ định múi giờ.

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ụ sử dụng ID múi giờ Olson để xuất ba ngày khác nhau từ một tài liệu, dựa trên ba múi giờ khác nhau.

db.dateParts.aggregate([
{
   $project: {
      dateUTC: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      },
      dateHonolulu: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Honolulu"
         }
      },
      dateAuckland: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      }
   }
}]).pretty()

Kết quả:

{
	"_id" : 1,
	"dateUTC" : ISODate("2020-12-31T10:30:25.123Z"),
	"dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"),
	"dateAuckland" : ISODate("2020-12-31T10:30:25.123Z")
}

Chênh lệch UTC

Dưới đây là một ví dụ sử dụng độ lệch UTC.

db.dateParts.aggregate([
{
   $project: {
      "date+00:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+00:00"
         }
      },
      "date-10:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "-10:00"
         }
      },
      "date+12:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+12:00"
         }
      }
   }
}]).pretty()

Kết quả:

{
	"_id" : 1,
	"date+00:00" : ISODate("2020-12-31T23:30:25.123Z"),
	"date-10:00" : ISODate("2021-01-01T09:30:25.123Z"),
	"date+12:00" : ISODate("2020-12-31T11:30:25.123Z")
}

Định dạng ngày theo tuần ISO

Các phần ngày tháng có thể được chỉ định bằng định dạng ISO 8601 nếu được yêu cầu.

Đặc biệt, bạn có thể sử dụng:

Định dạng chỉ định Đầu ra
isoWeekYear Năm ở định dạng ISO 8601. Trường này là bắt buộc nếu không sử dụng year (và year là bắt buộc nếu không sử dụng isoWeekYear ).
isoWeek Tuần trong năm ở định dạng ISO 8601. Chỉ có thể được sử dụng với isoWeekYear .
isoDayOfWeek Ngày trong tuần (1-Thứ Hai, 7-Chủ Nhật). Chỉ có thể được sử dụng với isoWeekYear .

Giả sử chúng ta chèn một tài liệu thứ hai giống như sau:

{
	"_id" : 2,
	"isoWeekYear" : 2021,
	"isoWeek" : 32,
	"isoDayOfWeek" : 7,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123,
	"timezone" : "UTC"
}

Chúng ta có thể thấy rằng nó sử dụng isoWeekYear , isoWeekisoDayOfWeek thay vì year , monthday (là những gì tài liệu đầu tiên sử dụng).

Chúng ta có thể sử dụng mã sau để tạo đối tượng Ngày từ tài liệu này:

db.dateParts.aggregate([
  { $match: { _id: 2} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "isoWeekYear": "$isoWeekYear", 
              "isoWeek": "$isoWeek", 
              "isoDayOfWeek": "$isoDayOfWeek", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond", 
              "timezone": "$timezone"
          }
        }
    }
  }
])

Kết quả:

{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") } 

Trường ngoài phạm vi

Bắt đầu từ MongoDB 4.4, phạm vi giá trị được hỗ trợ cho yearisoWeekYear1-9999 . Trong các phiên bản trước, giới hạn dưới cho các giá trị này là 0 và phạm vi giá trị được hỗ trợ là 0-9999 .

Bắt đầu trong MongoDB 4.0, nếu giá trị được chỉ định cho các trường khác với year , isoWeekYeartimezone nằm ngoài phạm vi hợp lệ, $dateFromParts toán tử mang hoặc trừ chênh lệch từ các phần ngày khác để tính ngày.

Giá trị cao hơn phạm vi

Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:

{
	"_id" : 3,
	"year" : 2020,
	"month" : 14,
	"day" : 65,
	"hour" : 48,
	"minute" : 130,
	"second" : 625,
	"millisecond" : 123
}

Nhiều trường ngày và giờ trong tài liệu này cao hơn phạm vi hợp lệ tương ứng của chúng.

Hãy chạy lệnh sau để chuyển đổi nó thành đối tượng Ngày:

db.dateParts.aggregate([
  { $match: { _id: 3} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Kết quả:

{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }

Chúng ta có thể thấy rằng các phần ngày tháng trong đối tượng Ngày kết quả khác với các phần ngày tháng tương ứng của chúng trong tài liệu. Điều này là do $dateFromParts đã tính toán lại ngày để tính cho các giá trị của phần ngày vượt quá phạm vi bình thường của chúng.

Giá trị thấp hơn phạm vi

Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:

{
	"_id" : 4,
	"year" : 2020,
	"month" : 0,
	"day" : 0,
	"hour" : 0,
	"minute" : 0,
	"second" : 0,
	"millisecond" : 0
}

Nhiều trường ngày và giờ trong tài liệu này thấp hơn phạm vi hợp lệ tương ứng của chúng.

Hãy chạy lệnh sau để chuyển đổi nó thành đối tượng Ngày:

db.dateParts.aggregate([
  { $match: { _id: 4} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Kết quả:

{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Gỡ cài đặt mongoDB khỏi ubuntu

  2. Ký tự khoảng trắng trong MongoDB

  3. Đếm phần tử mảng phù hợp với điều kiện

  4. Mongoose - RangeError:Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá

  5. Dịch <T> có thể truy vấn trở lại IMongoQuery