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

Mendapatkan cap waktu unix dalam hitungan detik dari MongoDB ISODate selama agregasi

Saya tidak yakin mengapa Anda berpikir Anda membutuhkan nilai dalam hitungan detik daripada milidetik karena umumnya kedua formulir itu valid dan dalam sebagian besar implementasi bahasa, milidetik sebenarnya lebih disukai. Tapi secara umum, mencoba memaksa ini menjadi string adalah cara yang salah untuk menyiasatinya, dan biasanya Anda hanya menghitung:

db.data.aggregate([
  { "$project": {
    "timestamp": {
      "$subtract": [
        { "$divide": [
            { "$subtract": [ "$md", new Date("1970-01-01") ] },
            1000
        ]},
        { "$mod": [
          { "$divide": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              1000
          ]},
          1
        ]}
      ]
    }
  }}
])

Yang mengembalikan Anda stempel waktu Epoch dalam hitungan detik. Pada dasarnya berasal dari ketika satu objek tanggal BSON dikurangi dari yang lain maka hasilnya adalah interval waktu dalam milidetik. Menggunakan tanggal Epoch awal "1970-01-01" pada dasarnya menghasilkan nilai milidetik dari nilai tanggal saat ini. $divide operator pada dasarnya melepas bagian milidetik dan $mod melakukan modulo untuk mengimplementasikan pembulatan.

Sungguh meskipun Anda lebih baik melakukan pekerjaan dalam bahasa asli untuk aplikasi Anda karena semua tanggal BSON akan dikembalikan ke sana sebagai tipe "tanggal/tanggal" asli di mana Anda dapat mengekstrak nilai stempel waktu. Pertimbangkan dasar-dasar JavaScript di shell:

var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )

Biasanya dengan agregasi Anda ingin melakukan "matematika" semacam ini ke nilai stempel waktu untuk digunakan dalam sesuatu seperti menggabungkan nilai dalam periode waktu seperti sehari. Ada operator tanggal yang tersedia untuk kerangka agregasi, tetapi Anda juga dapat melakukannya dengan cara matematika tanggal:

db.data.aggregate([
    { "$group": {
        "_id": {
          "$subtract": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              { "$mod": [
                  { "$subtract": [ "$md", new Date("1970-01-01") ] },
                  1000 * 60 * 60 * 24
              ]}
          ]
        },
        "count": { "$sum": 1 }
    }}
])

Formulir tersebut akan lebih umum untuk memancarkan stempel waktu yang dibulatkan menjadi satu hari, dan menggabungkan hasil dalam interval tersebut.

Jadi tujuan Anda dari kerangka agregasi hanya untuk mengekstrak stempel waktu tampaknya bukan penggunaan terbaik atau memang seharusnya tidak perlu mengonversi ini menjadi detik daripada milidetik. Dalam kode aplikasi Anda adalah di mana saya pikir Anda harus melakukan itu kecuali tentu saja Anda benar-benar menginginkan hasil untuk interval waktu di mana Anda dapat menerapkan matematika tanggal seperti yang ditunjukkan.

Metodenya ada, tetapi kecuali jika Anda benar-benar menggabungkan maka ini akan menjadi opsi kinerja terburuk untuk aplikasi Anda. Lakukan konversi dalam kode saja.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pengantar tipe data MongoDB

  2. Tidak dapat memulai gambar docker mongo di windows

  3. MongoDB GPG - Tanda Tangan Tidak Valid

  4. Bagaimana cara memasukkan HTML ke Mongodb?

  5. GridFS di Spring Data MongoDB