mongodb - 如何查询时间最长的对象?
问题描述
我正在寻找一个返回最长时间段的对象的查询。
因此集合中的每个条目都具有以下属性,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
?
解决方案
假设您的日期是String
s,并且由于它们的格式非常好,您可以使用'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" }
推荐阅读
- sql - Flink SQL:Outer Join with Group By 给出了意外的输出
- git - 纱线说“模式试图在同一个目的地拆包”
- javascript - 渲染时如何有效地截断其中包含html标签的文本?
- typescript - ESlint 不适用于带有打字稿的 .vue 文件
- php - 无法连接,无法与服务器建立连接
- javascript - 如何使用 Laravel 后端和 Vue 前端从数据库中获取数据?
- jquery - 从linkedin Sales Navigator 获取元数据
- angular - 如何动态填充 FormGroup?
- ios - 自动更新 App Store 订阅需要“恢复购买”?
- c# - 将 HTML 锚标记绑定到文本块自适应卡片