Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何查询时间段最长的对象?_Mongodb_Date - Fatal编程技术网

Mongodb 如何查询时间段最长的对象?

Mongodb 如何查询时间段最长的对象?,mongodb,date,Mongodb,Date,我正在寻找一个可以返回最长时间段的对象的查询 因此,集合中的每个条目都具有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 fini

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

因此,集合中的每个条目都具有
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
startDate
之间具有最长时间段差异的两个项目?

假设您的日期是
String
s,并且由于它们的格式非常好,您可以使用
Mongo 4.0
的转换器将它们转换为
Date
对象。(对于早期版本,您可以使用)

一旦您有了日期,您就可以获得它们的差值,该差值提供了两个日期之间的毫秒数

因此,我们可以使用(或启动
Mongo 4.2
)将此字段添加到每个文档中,并通过操作员在新的
期间
字段上按降序对所有文档进行排序

最后,要仅保留期限最长的两个文档,可以应用一个阶段:


存储记录时计算差异,然后将该值存储在entityGreat Answer!中的另一个字段中:)
// { 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" }