Как запросить объекты с самым длинным периодом времени? - PullRequest
2 голосов
/ 24 июня 2019

Я ищу запрос, который бы возвращал объекты с самым длинным периодом времени.

Таким образом, каждая запись в коллекции имеет атрибуты startDate и finishDate, например:

id: 1  startDate: 2019-01-22 23:23:47  finishDate: 2019-01-22 20:58:47 
id: 2  startDate: 2019-01-22 23:12:47  finishDate: 2019-01-22 11:58:47
id: 3  startDate: 2019-01-22 23:23:47  finishDate: 2019-01-22 13:58:47 

Как мне найти 2 предмета с самой большой разницей во времени между endDate и startDate?

1 Ответ

1 голос
/ 24 июня 2019

Предполагая, что ваши даты 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" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...