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

MongoDB $isoWeekYear

Di MongoDB, $isoWeekYear operator pipa agregasi mengembalikan tahun penomoran minggu ISO untuk nilai tanggal tertentu. Ini adalah nomor tahun dalam format ISO 8601.

Saat menggunakan $isoWeekYear operator, Anda dapat secara opsional menentukan zona waktu yang akan digunakan untuk hasil.

$isoWeekYear operator menerima baik tanggal (baik sebagai Tanggal, Timestamp, atau ObjectId), atau dokumen yang menentukan tanggal dan zona waktu untuk digunakan.

Contoh

Misalkan kita memiliki koleksi yang disebut cats dengan dokumen berikut:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Kita dapat menjalankan kode berikut untuk mengekstrak tahun ISO dari kode born bidang dalam dokumen itu.

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

Hasil:

{ "birthIsoWeekYear" : NumberLong(2020) } 

Kita bisa melihat bahwa tahun ISO sebenarnya adalah 2020, padahal tanggalnya sudah ditentukan tahun 2021. Hal ini karena tahun ISO tidak selesai sampai minggu terakhir selesai. Dan dalam hal ini, minggu dimulai pada akhir tahun sebelumnya, dan belum selesai. Beginilah cara kerja tahun ISO.

Di sini, saya menggunakan birthIsoWeekYear sebagai nama bidang yang akan dikembalikan, tetapi ini bisa berupa apa saja (seperti isoWeekYear , isoYear , dll).

_id bidang dikembalikan secara default saat menggunakan proyeksi di MongoDB, tetapi dalam contoh ini saya secara eksplisit menyembunyikan _id kolom menggunakan _id: 0 .

Tentukan Zona Waktu

Anda dapat menentukan zona waktu yang akan digunakan untuk output $isoWeekYear operator.

Saat Anda melakukan ini, argumen diteruskan ke $isoWeekYear harus dalam bentuk berikut:

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

Dimana <dateExpression> adalah tanggal untuk digunakan, dan <tzExpression> adalah zona waktu yang digunakan.

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 tahun ISO dalam dua zona waktu berbeda, masing-masing menggunakan ID zona waktu Olson:

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          honolulu: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
)

Hasil:

{ "honolulu" : NumberLong(2020), "auckland" : NumberLong(2021) } 

Dalam hal ini, tanggal bergerak maju ke tahun ISO berikutnya saat menggunakan Pacific/Auckland zona waktu.

Offset UTC

Ini contoh yang sama, kecuali kali ini kita menggunakan offset UTC.

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

Hasil:

{ "utcOffset-1000" : NumberLong(2020), "utcOffset+1200" : NumberLong(2021) } 

Mengembalikan Tahun ISO dari ObjectId

Anda dapat menggunakan $isoWeekYear untuk mengembalikan bagian tahun ISO dari ObjectId.

Nilai ObjectId adalah nilai heksadesimal 12 byte yang terdiri dari:

  • Nilai cap waktu 4 byte, mewakili pembuatan ObjectId, diukur dalam detik sejak zaman Unix.
  • 5 byte adalah nilai acak
  • Penghitung pertambahan 3 byte, diinisialisasi ke nilai acak.

Untuk rekap, dokumen kami terlihat seperti ini:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Dokumen ini berisi ObjectId. Oleh karena itu, kita dapat menggunakan $isoWeekYear untuk mengembalikan tahun ISO dokumen kami dibuat (atau lebih khusus, ketika _id nilai ObjectId bidang telah dibuat).

Contoh:

db.cats.aggregate(
  [
    {
      $project:
        {
          "timeStamp": { $toDate: "$_id"},
          "isoWeekYear": { $isoWeekYear: "$_id" }
        }
    }
  ]
).pretty()

Hasil:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"timeStamp" : ISODate("2021-01-21T00:24:05Z"),
	"isoWeekYear" : NumberLong(2021)
}

Kita dapat melihat bahwa dokumen tersebut dibuat pada tahun ISO 2021.

Dalam hal ini, saya juga menggunakan $toDate operator pipa agregasi untuk mengembalikan bagian stempel waktu ObjectId.

Tentang Sistem Tanggal Minggu ISO

Sistem tanggal minggu ISO adalah sistem kalender yang merupakan bagian dari standar tanggal dan waktu ISO 8601 yang dikeluarkan oleh International Organization for Standardization (ISO). Sistem menentukan tahun minggu di atas kalender Gregorian dengan mendefinisikan notasi untuk minggu ordinal dalam setahun.

Tahun penomoran minggu ISO memiliki 52 atau 53 minggu penuh. Ini berarti ada 364 atau 371 hari dalam setahun, bukan 365 atau 366 hari biasa.

Minggu ISO dimulai dengan hari Senin. Setiap tahun dalam minggu ISO adalah tahun Gregorian di mana hari Kamis jatuh. Angka minggu ISO dimulai dari 1 dengan minggu yang berisi Kamis pertama tahun itu.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Impor Data CSV sebagai Array di MongoDB menggunakan mongoimport

  2. Bagaimana cara mengganti substring dalam dokumen mongodb

  3. Menghapus catatan duplikat menggunakan MapReduce

  4. $unionWith – Setara MongoDB dengan UNION ALL

  5. Subset array dalam pipa kerangka kerja agregasi