MongoDB - 获取两个日期字段之间的聚合差异

时间:2018-02-08 19:18:40

标签: mongodb aggregation-framework

我有一个名为list的集合,其中包含以下字段:

{ "_id" : ObjectId("5a7c9f60c05d7370232a1b73"), "created_date" : ISODate("2018-11-10T04:40:11Z"), "processed_date" : ISODate("2018-11-10T04:40:10Z") }
{ "_id" : ObjectId("5a7c9f85c05d7370232a1b74"), "created_date" : ISODate("2018-11-10T04:40:11Z"), "processed_date" : ISODate("2018-11-10T04:41:10Z") }
{ "_id" : ObjectId("5a7c9f89c05d7370232a1b75"), "created_date" : ISODate("2018-11-10T04:40:11Z"), "processed_date" : ISODate("2018-11-10T04:42:10Z") }
{ "_id" : ObjectId("5a7c9f8cc05d7370232a1b76"), "created_date" : ISODate("2018-11-10T04:40:11Z"), "processed_date" : ISODate("2018-11-10T04:42:20Z") }

我需要以下列格式找出汇总结果(processed_date和created_date之间的差异):

  [{
    "30Sec":count_for_diffrence_1,
    "<=60Sec":count_for_diffrence_2,
    "<=90Sec":count_for_diffrence_3
  }]

如果我们可以找出项目如何花费30秒,60秒等等,还要确保&lt; = 60秒的结果不应该在&lt; = 90Sec。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以在3.6版本中尝试以下聚合查询。

$match的{​​p> $expr限制时差为90秒或更短的文档。

<$group $sum db.collection.aggregate([ {"$match":{"$expr":{"$lte":[{"$subtract":["$processed_date","$created_date"]},90000]}}}, {"$group":{ "_id":null, "30Sec":{"$sum":{"$cond":{"if":{"$eq":[{"$subtract":["$processed_date","$created_date"]},30000]},"then":1,"else":0}}}, "<=60Sec":{"$sum":{"$cond":{"if":{"$lte":[{"$subtract":["$processed_date","$created_date"]},60000]},"then":1,"else":0}}}, "<=90Sec":{"$sum":{"$cond":{"if":{"$lte":[{"$subtract":["$processed_date","$created_date"]},90000]},"then":1,"else":0}}} }} ]) 来计算不同时间片的出现次数。

{$and:[{"$gte":[{"$subtract":["$processed_date","$created_date"]},0]}, {"$lte":[{"$subtract":["$processed_date","$created_date"]},60000]}]}

请注意,如果创建的日期大于处理日期,您可能需要添加条件以仅查找差值介于0和您请求的时间片之间的值。

这样的东西
2   Abbot
1   Doris
4   Emerson
3   Green
5   Jeames