В моей коллекции Mongo мне нужно сравнить три даты и найти самую последнюю. Мне интересно, есть ли у вас короткий или родной способ MongoDB?
При сравнении двух дат в vanilla JS я мог бы что-то вроде:
let compareDates = (date1, date2) => {
if (date1>date2) return ("Date1 > Date2");
else if (date1<date2) return ("Date2 > Date1");
else return ("Date1 = Date2");
}
console.log(compare_dates(new Date('11/14/2018 00:00'), new Date('11/14/2018 00:00')));
console.log(compare_dates(new Date('11/14/2018 00:01'), new Date('11/14/2018 00:00')));
console.log(compare_dates(new Date('11/14/2018 00:00'), new Date('11/14/2018 00:01')));
... но это займет много времени с тремя датами. Есть ли более короткий способ сравнить три даты и вернуть самую последнюю дату?
Возьмем упрощенную модель:
{
_id: '123',
date1: {
type: Date,
},
date2: {
type: Date,
},
date3: {
type: Date,
}
}
Предполагая, что ваша модель выглядит так:
{
date1: ISODate("1990-01-01T00:00:00Z"),
date2: ISODate("1980-01-01T00:00:00Z"),
date3: ISODate("1970-01-01T00:00:00Z")
}
Вы можете просто использовать $ max для получения последних данных:
db.collection.aggregate([
{
$project: {
recentDate: { $max: [ "$date1", "$date2", "$date3" ] }
}
}
])
$max
звучит как идеальное решение здесь. Спасибо, @mickl!
Чтобы добавить некоторые решения POJS, Math.max работает, но возвращает значение времени. Кроме того, сортируйте их в массиве и получите последний:
var dates = [
new Date('2018-01-01'),
new Date('2018-01-03'),
new Date('2018-01-02')
];
// Returns a new Date
console.log(new Date(Math.max(...dates)));
// Returns one of the dates, sorts and shortens the array
console.log(dates.sort((a,b)=>a-b).pop());
// Returns a reference to one of the dates, sorts but doesn't shorten the array
console.log(dates.sort((a,b)=>a-b).slice(-1)[0]);