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

MongoDB $dateToParts

Di MongoDB, $dateToParts operator pipa agregasi mengembalikan bagian tanggal dari tanggal tertentu.

Lebih khusus lagi, ini mengembalikan dokumen yang berisi bagian-bagian penyusun dari nilai Tanggal BSON yang diberikan sebagai properti individual.

Bagian tanggal yang dikembalikan oleh $dateToParts adalah year , month , day , hour , minute , second dan millisecond .

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

$dateToParts 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 pets dengan dokumen berikut:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Kita dapat menjalankan kode berikut untuk mengembalikan berbagai bagian tanggal dari born bidang dalam dokumen itu.

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

Hasil:

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

Kita dapat melihat bahwa setiap bagian tanggal dikembalikan dalam bidangnya sendiri.

Di sini, saya menggunakan dateParts sebagai nama bidang yang akan dikembalikan, tetapi ini bisa berupa apa saja (seperti theDate 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 $dateToParts operator.

Saat Anda melakukan ini, argumen diteruskan ke $dateToParts 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 bagian tanggal dalam dua zona waktu yang berbeda, masing-masing menggunakan ID zona waktu Olson:

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

Hasil:

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

Dalam hal ini, tanggal bergerak maju ke tahun/bulan/minggu/hari/jam berikutnya saat menggunakan Pacific/Auckland zona waktu.

Offset UTC

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

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

Hasil:

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

Bagian Tanggal Minggu ISO

Anda dapat menggunakan iso8601: true untuk memodifikasi dokumen keluaran untuk menggunakan bidang tanggal minggu ISO. Ini mendasarkan tanggal pada standar ISO 8601.

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 bidang tanggal ISO dari kode born bidang dalam dokumen itu.

Berikut ini contoh untuk didemonstrasikan:

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

Hasil:

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

Dokumen keluaran pertama menggunakan keluaran tanggal normal. Dokumen kedua menggunakan bidang dan nilai tanggal minggu ISO.

Kembalikan Bagian Tanggal dari ObjectId

Anda dapat menggunakan $dateToParts untuk mengembalikan bagian tanggal 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("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Dokumen ini berisi ObjectId. Oleh karena itu, kami dapat menggunakan $dateToParts untuk mengembalikan bagian tanggal, berdasarkan tanggal pembuatan dokumen kita (atau lebih khusus lagi, saat _id nilai ObjectId bidang telah dibuat).

Contoh:

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

Hasil:

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

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $hariDariMinggu

  2. Rata-rata bergerak dengan kerangka agregasi MongoDB?

  3. Dorong item ke dalam array mongo melalui luwak

  4. Panduan untuk Query di Spring Data MongoDB

  5. MongoDB - Kueri Koleksi