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

MongoDB $ dateFromString

Trong MongoDB, $dateFromString toán tử đường ống tổng hợp chuyển đổi một chuỗi ngày / giờ thành một đối tượng ngày tháng.

Ví dụ

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

{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" }
{ "_id" : 2, "bar" : "2020-12-31" }
{ "_id" : 3, "bar" : "2020-12-31T23:30" }

Tất cả các tài liệu đều chứa chuỗi ngày / giờ.

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

db.foo.aggregate([ 
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar'
          }
        }
    }
  } 
])

Kết quả:

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

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

Tôi cũng đã thay đổi tên trường từ bar đến date .

Chỉ định một định dạng

Bạn có thể cung cấp một định dạng bar tùy chọn đối số để chỉ định định dạng của chuỗi ngày / giờ đang được cung cấp. Đặ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.

Định dạng bar tham số có sẵn từ MongoDB phiên bản 4.0.

Định dạng mặc định là %Y-%m-%dT%H:%M:%S.%LZ , đó là những gì ví dụ trước sử dụng.

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

{ "_id" : 4, "bar" : "07/08/2020" }

Trong trường hợp này, ngày có thể là ngày thứ 7 của tháng thứ 8 hoặc ngày thứ 8 của tháng thứ 7, tùy thuộc vào ngôn ngữ được sử dụng.

Chúng tôi có thể sử dụng đặc tả định dạng để chỉ định chính xác định dạng đó nên là.

Ví dụ:

db.foo.aggregate([ 
  { $match: { _id: 4 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              format: "%m/%d/%Y"
          }
        }
    }
  } 
])

Kết quả:

{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }

Trong trường hợp này, chúng tôi đã chỉ định rằng đó là ngày thứ 8 của tháng thứ 7.

Đây là một lần nữa, nhưng lần này chúng tôi hoán đổi ngày và tháng.

db.foo.aggregate([ 
  { $match: { _id: 4 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              format: "%d/%m/%Y"
          }
        }
    }
  } 
])

Kết quả:

{ "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }

Lần này được hiểu là ngày thứ 7 của tháng thứ 8.

Xem MongoDB $dateFromString Mã định dạng cho danh sách các mã định dạng hợp lệ.

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

Có một số chỉ định định dạng cho phép bạn chỉ định 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ó tài liệu giống như sau:

{ "_id" : 5, "bar" : "7-8-2020" }

Chúng tôi có thể hiểu ngày đó là ngày thứ 7 của tuần ISO, tiếp theo là tuần ISO thứ 8 trong năm, sau đó là năm.

Như thế này:

db.foo.aggregate([ 
  { $match: { _id: 5 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              format: "%u-%V-%G"
          }
        }
    }
  } 
])

Kết quả:

{ "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }

Chỉ định múi giờ

Bạn có thể chỉ định múi giờ để sử dụng với $dateFromString 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.foo.aggregate([ 
  { $match: { _id: 1 } },
  {
    $project: {
        utc: {
          $dateFromString: {
              dateString: '$bar',
              timezone: "UTC"
          }
        },
        honolulu: {
          $dateFromString: {
              dateString: '$bar',
              timezone: "Pacific/Honolulu"
          }
        },
        auckland: {
          $dateFromString: {
              dateString: '$bar',
              timezone: "Pacific/Auckland"
          }
        }
    }
  } 
]).pretty()

Kết quả:

{
	"_id" : 1,
	"utc" : ISODate("2020-12-31T23:30:25.123Z"),
	"honolulu" : ISODate("2021-01-01T09:30:25.123Z"),
	"auckland" : 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.foo.aggregate([ 
  { $match: { _id: 1 } },
  {
    $project: {
        "date+00:00": {
          $dateFromString: {
              dateString: '$bar',
              timezone: "+00:00"
          }
        },
        "date-10:00": {
          $dateFromString: {
              dateString: '$bar',
              timezone: "-10:00"
          }
        },
        "date+12:00": {
          $dateFromString: {
              dateString: '$bar',
              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")
}

Nếu bạn sử dụng timezone tham số, chuỗi ngày không thể được thêm bằng chữ Z để biểu thị giờ Zulu (múi giờ UTC). Ví dụ:chuỗi ngày không được là 2020-12-31T23:30:25.123Z khi sử dụng tham số múi giờ.

Ngoài ra, không bao gồm thông tin múi giờ trong chuỗi ngày khi sử dụng thông số múi giờ.

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.

Giả sử chúng ta có một tài liệu như sau:

{ "_id" : 6, "bar" : null }

Chúng tôi có thể sử dụng onNull theo cách sau:

db.foo.aggregate([ 
  { $match: { _id: 6 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              onNull: "No valid date was supplied"
          }
        }
    }
  } 
])

Kết quả:

{ "_id" : 6, "date" : "No valid date was 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ố.

onError Tham số

Bạn có thể tùy ý sử dụng onError để cung cấp một biểu thức để xuất ra trong trường hợp xảy ra lỗi.

Giả sử bộ sưu tập của chúng tôi chứa tài liệu sau:

{ "_id" : 7, "bar" : "21st Dec, 2030" }

Mặc dù có một ngày trong thanh bar , đó không phải là một chuỗi ngày / giờ hợp lệ và do đó sẽ gây ra lỗi nếu chúng tôi sử dụng dateFromString để cố gắng chuyển đổi nó thành một đối tượng ngày tháng.

Ví dụ về lỗi:

db.foo.aggregate([ 
  { $match: { _id: 7 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar'
          }
        }
    }
  } 
])

Kết quả:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "an incomplete date/time string has been found, with elements missing: \"21st Dec, 2030\"",
	"code" : 241,
	"codeName" : "ConversionFailure"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Đó là một lỗi trông khó chịu.

Chúng ta có thể sử dụng onError để làm cho nó trông đẹp hơn:

db.foo.aggregate([ 
  { $match: { _id: 7 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              onError: "An error occurred while parsing the date string"
          }
        }
    }
  } 
])

Kết quả:

{ "_id" : 7, "date" : "An error occurred while parsing the date string" }

Xem như onNullonError các tham số cho phép chúng tôi trả lại các tài liệu thực tế, chúng cho phép chúng tôi trả lại nhiều tài liệu mà không phải lo lắng về việc một tài liệu xấu sẽ làm dừng toàn bộ hoạt động.

Ví dụ:

db.foo.aggregate([ 
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              onNull: "The date was either empty or null",
              onError: "An error occurred while parsing the date string"
          }
        }
    }
  } 
])

Kết quả:

{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
{ "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") }
{ "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") }
{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
{ "_id" : 5, "date" : ISODate("2020-08-07T00:00:00Z") }
{ "_id" : 6, "date" : "The date was either empty or null" }
{ "_id" : 7, "date" : "An error occurred while parsing the date string" }


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tránh cảnh báo phân tích cú pháp chuỗi URL hiện tại không được dùng nữa bằng cách đặt useNewUrlParser thành true

  2. Cách unhideIndex () hoạt động trong MongoDB

  3. MongoDB $ kéo

  4. Triển khai cơ sở dữ liệu đám mây với ClusterControl 1.6

  5. MongoDB - Cập nhật tài liệu