MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $dateFromString

Di MongoDB, $dateFromString operator pipeline agregasi mengonversi string tanggal/waktu menjadi objek tanggal.

Contoh

Misalkan kita memiliki koleksi yang disebut foo dengan dokumen sebagai berikut:

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

Semua dokumen berisi string tanggal/waktu.

Kita dapat menjalankan kode berikut untuk mengembalikan objek tanggal dari bar bidang dalam dokumen tersebut.

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

Hasil:

{ "_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") }

Semua string tanggal/waktu telah diubah menjadi objek tanggal.

Saya juga telah mengubah nama bidang dari bar untuk date .

Tentukan Format

Anda dapat memberikan format opsional argumen untuk menentukan format string tanggal/waktu yang disediakan. Spesifikasi format dapat berupa string literal apa pun, yang berisi 0 atau lebih penentu format.

format parameter tersedia dari MongoDB versi 4.0.

Format defaultnya adalah %Y-%m-%dT%H:%M:%S.%LZ , yang digunakan oleh contoh sebelumnya.

Misalkan kita memasukkan dokumen berikut ke dalam koleksi kita:

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

Dalam hal ini, tanggal dapat berupa hari ke-7 di bulan ke-8, atau hari ke-8 di bulan ke-7, bergantung pada lokal yang digunakan.

Kita dapat menggunakan spesifikasi format untuk menentukan dengan tepat yang mana seharusnya.

Contoh:

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

Hasil:

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

Dalam hal ini, kami menetapkan bahwa ini adalah hari ke-8 di bulan ke-7.

Ini dia lagi, tapi kali ini kita bertukar hari dan bulan.

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

Hasil:

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

Kali ini diartikan sebagai hari ke-7 bulan ke-8.

Lihat MongoDB $dateFromString Penentu Format untuk daftar penentu format yang valid.

Format Tanggal Minggu ISO

Ada beberapa penentu format yang memungkinkan Anda menentukan tanggal menggunakan format ISO 8601.

Secara khusus, Anda dapat menggunakan:

Penentu Format Keluaran
%G Tahun dalam format ISO 8601
%u Nomor hari dalam seminggu dalam format ISO 8601 (1-Senin, 7-Minggu)
%V Minggu Tahun dalam format ISO 8601

Misalkan kita memiliki dokumen yang terlihat seperti ini:

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

Kita dapat menafsirkan tanggal tersebut sebagai hari ke-7 dalam minggu ISO, diikuti oleh minggu ISO ke-8 dalam setahun, diikuti oleh tahun.

Seperti ini:

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

Hasil:

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

Tentukan Zona Waktu

Anda dapat menentukan zona waktu untuk digunakan dengan $dateFromString operator.

Zona waktu dapat ditentukan menggunakan pengidentifikasi zona waktu Olson (mis. "Europe/London" , "GMT" ) atau offset UTC (mis. "+02:30" , "-1030" ).

Identifier Zona Waktu Olson

Berikut adalah contoh yang menampilkan string tanggal dalam tiga zona waktu berbeda, masing-masing menggunakan ID zona waktu 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()

Hasil:

{
	"_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")
}

Offset UTC

Berikut adalah contoh yang menggunakan offset 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()

Hasil:

{
	"_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")
}

Jika Anda menggunakan timezone parameter, string tanggal tidak dapat ditambahkan dengan Z untuk menunjukkan waktu Zulu (zona waktu UTC). Misalnya, string tanggal tidak boleh 2020-12-31T23:30:25.123Z saat menggunakan parameter zona waktu.

Selain itu, jangan sertakan informasi zona waktu dalam string tanggal saat menggunakan parameter zona waktu.

onNull Parameter

onNull parameter dapat digunakan untuk menentukan apa yang harus dikembalikan jika tanggalnya nol atau tidak ada.

Nilai yang diberikan ke onNull parameter dapat berupa ekspresi apa pun yang valid.

Misalkan kita memiliki dokumen seperti ini:

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

Kita bisa menggunakan onNull dengan cara berikut:

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

Hasil:

{ "_id" : 6, "date" : "No valid date was supplied" }

Dalam hal ini, tanggalnya adalah null dan dokumen keluaran menyertakan string yang saya berikan untuk onNull parameter.

onError Parameter

Anda dapat secara opsional menggunakan onError parameter untuk memberikan ekspresi ke output jika terjadi kesalahan.

Misalkan koleksi kita berisi dokumen berikut:

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

Meskipun ada tanggal di bar field, ini bukan string tanggal/waktu yang valid, dan karena itu akan menyebabkan kesalahan jika kita menggunakan dateFromString untuk mencoba mengubahnya menjadi objek tanggal.

Contoh kesalahan:

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

Hasil:

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

Itu adalah kesalahan yang terlihat buruk.

Kita dapat menggunakan onError parameter agar terlihat lebih bagus:

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

Hasil:

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

Melihat sebagai onNull dan onError parameter memungkinkan kami untuk mengembalikan dokumen yang sebenarnya, mereka memungkinkan kami untuk mengembalikan beberapa dokumen, tanpa khawatir tentang satu dokumen yang buruk menghentikan seluruh operasi.

Contoh:

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"
          }
        }
    }
  } 
])

Hasil:

{ "_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. Luwak, urutkan kueri berdasarkan bidang yang diisi

  2. MongoDB:Timeout terjadi setelah 30000ms memilih server menggunakan CompositeServerSelector

  3. dapatkan objek mongodb _id setelah upsert dengan php

  4. Catatan acak dari MongoDB

  5. Bagaimana meningkatkan kinerja sisipan MongoDB