Предполагая, что ваши даты String
с, и, поскольку они довольно хорошо отформатированы, вы можете конвертировать их в Date
объекты, используя конвертер Mongo 4.0
* $toDate
.(в более ранних версиях вы можете использовать $dateFromString
)
Если у вас есть даты, вы можете получить их разницу с помощью $subtract
, которая обеспечивает количество миллисекунд междудве даты.
Таким образом, мы можем добавить это поле к каждому документу с $addFields
(или $set
начиная с Mongo 4.2
) и таким образом отсортировать все документыуменьшив порядок в этом новом поле period
с помощью оператора $sort
.
Наконец, чтобы сохранить только два документа с самыми длинными периодами, вы можете применить $limit
этап:
// { id: 1, startDate: "2019-01-22 20:58:47", finishDate: "2019-01-22 23:23:47" }
// { id: 2, startDate: "2019-01-22 11:58:47", finishDate: "2019-01-22 23:12:47" }
// { id: 3, startDate: "2019-01-22 13:58:47", finishDate: "2019-01-22 23:23:47" }
db.collection.aggregate([
{ $addFields: {
period: { $subtract: [ { $toDate: "$finishDate" }, { $toDate: "$startDate" } ] }
} },
{ $sort: { period: -1 } },
{ $limit: 2 }
])
// { id: 2, period: NumberLong(40440000), startDate: "2019-01-22 11:58:47", finishDate: "2019-01-22 23:12:47" }
// { id: 3, period: NumberLong(33900000), startDate: "2019-01-22 13:58:47", finishDate: "2019-01-22 23:23:47" }