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.