Anda dapat $sort
dan menggunakan $last
untuk item tersebut, dengan membulatkan kunci pengelompokan ke setiap hari:
db.collection.aggregate([
{ "$sort": { "timestamp": 1 } },
{ "$group": {
"_id": {
"$add": [
{ "$subtract": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
1000 * 60 * 60 * 24
]}
]},
new Date(0)
]
},
"lastDoc": { "$last": "$$ROOT" }
}}
])
Jadi pengurutan membuat segala sesuatunya tampak berurutan, dan kemudian pengelompokan _id
dibulatkan untuk setiap hari berdasarkan tanggal matematika tertentu. Anda mengurangi tanggal zaman dari tanggal saat ini untuk menjadikannya angka. Gunakan modulus untuk membulatkan menjadi satu hari, lalu tambahkan tanggal zaman ke angka tersebut untuk menghasilkan Date
.
Jadi dengan menghitungnya, kita mendapatkan nilai stempel waktu dari tanggal dengan baris $subract
. Kami melakukan ini beberapa kali:
{ "$subtract": [ "$timestamp", new Date(0) ] }
// Is roughly internally like
ISODate("2017-06-06T10:44:37.627Z") - ISODate("1970-01-01T00:00:00Z")
1496745877627
Lalu ada modulo dengan $mod
yang bila diterapkan pada nilai numerik akan mengembalikan selisihnya. 1000 milidetik * 60 detik * 60 * menit * 24 jam memberikan argumen lain:
{ "$mod": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
1000 * 60 * 60 * 24
]}
// Equivalent to
1496745877627 % (1000 * 60 * 60 * 24)
38677627
Lalu ada pembungkus $subtract
dari kedua angka tersebut:
{ "$subtract": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
1000 * 60 * 60 * 24
]}
]}
// Subtract "difference" of the modulo to a day
// from the milliseconds value of the current date
1496745877627 - 38677627
1496707200000
Kemudian tambahkan kembali nilai tanggal zaman untuk membuat tanggal yang dibulatkan ke hari ini, yang pada pipa agregasi pada dasarnya terlihat seperti memberikan nilai milidetik ke konstruktor:
new Date(1496707200000)
ISODate("2017-06-06T00:00:00Z")
Yang mengambil nilai stempel waktu dan mengurangi selisih pembagi dari "satu hari" dan berakhir pada waktu di "awal hari".
Cukup gunakan $$ROOT
di sini untuk mewakili keseluruhan dokumen. Namun jalur dokumen apa pun yang disediakan ke $last
di sini akan memberikan hasilnya.
person
Neil Lunn
schedule
06.06.2017
$group
) dan pertahankandata
terakhir dengan$last
- person felix   schedule 06.06.2017