Вы можете $sort
использовать $last
для элемента с округлением ключа группировки до каждого дня:
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" }
}}
])
Таким образом, сортировка заставляет вещи отображаться по порядку, а затем группировка _id
округляется для каждого дня с помощью некоторой математики даты. Вы вычитаете дату эпохи из текущей даты, чтобы сделать ее числом. Используйте модуль для округления до дня, затем добавьте дату эпохи к числу, чтобы получить Date
.
Итак, пройдясь по математике, мы получили значение метки времени из даты с помощью строки $subract
. Делаем это пару раз:
{ "$subtract": [ "$timestamp", new Date(0) ] }
// Is roughly internally like
ISODate("2017-06-06T10:44:37.627Z") - ISODate("1970-01-01T00:00:00Z")
1496745877627
Затем есть модуль с $mod
, который при применении к числовому значению возвращает разницу. 1000 миллисекунд * 60 секунд * 60 * минут * 24 часа дают другой аргумент:
{ "$mod": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
1000 * 60 * 60 * 24
]}
// Equivalent to
1496745877627 % (1000 * 60 * 60 * 24)
38677627
Затем идет упаковка $subtract
двух чисел:
{ "$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
Затем добавьте обратно значение даты эпохи, чтобы создать дату, округленную до текущего дня, что для конвейера агрегации в основном выглядит как предоставление значения миллисекунды конструктору:
new Date(1496707200000)
ISODate("2017-06-06T00:00:00Z")
Который принимает значение метки времени и вычитает разницу делителя из «одного дня» и заканчивается временем в «начале дня».
Просто используйте здесь $$ROOT
для представления всего документа. Но любой путь к документу, указанный здесь для $last
, дает результат.
person
Neil Lunn
schedule
06.06.2017
$group
) и сохраните последнийdata
с$last
. - person felix   schedule 06.06.2017