首页 > 解决方案 > 如何查询时间最长的对象?

问题描述

我正在寻找一个返回最长时间段的对象的查询。

因此集合中的每个条目都具有以下属性,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 

如何找到endDate和之间时间段差最长的 2 个项目startDate

标签: mongodbdate

解决方案


假设您的日期是Strings,并且由于它们的格式非常好,您可以使用's转换器将它们转换为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" }

推荐阅读