计算一系列日期的平均持续时间

时间:2018-05-15 19:48:42

标签: mongodb mongoose mongodb-query aggregation-framework

好吧,我有一个包含太多文档的集合(数百万),现在我想知道如何计算会话持续时间的平均值。

这是我的文档结构的一个例子:

{
    "session" : "xyz",
    "date" : {"$date" : ""Tue May 15 2018 10:35:08 GMT-0400 LT""}
}
{
    "session" : "xyz",
    "date" : {"$date" : ""Tue May 15 2018 12:35:08 GMT-0400 LT""}
}
{
    "session" : "xyz",
    "date" : {"$date" : ""Tue May 15 2018 15:35:08 GMT-0400 LT""}
}
{
    "session" : "abc",
    "date" : {"$date" : ""Tue May 15 2018 09:35:08 GMT-0400 LT""}
}
{
    "session" : "abc",
    "date" : {"$date" : ""Tue May 15 2018 11:35:08 GMT-0400 LT""}
}

我想定义一个这样的算法:

  1. 通过" $ session"
  2. 获取所有文件
  3. 计算这些(第二点)文件的最短(第一)日期和最长(最后)日期。
  4. 按会话计算持续时间(时差)
  5. 使用另一个" $ session"
  6. 重新获得第一个第一点
  7. 在通过" $ session"计算所有平均值后,计算这些总数的平均值。
  8. 我认为首先需要使用aggregate和$ g​​roup,但我没有经验,现在我有一个存在问题哈哈哈

    由于

1 个答案:

答案 0 :(得分:1)

只要“序列”在这里不重要,那么$min$max就是正确的选择:

db.collection.aggregate([
  { "$group": {
    "_id": "$session",
    "minDate": { "$min": "$date" },
    "maxDate": { "$max": "$date" }
  }},
  { "$group": {
    "_id": null,
    "avg": {
      "$avg": { "$subtract": [ "$maxDate", "$minDate" ] }
    }
  }}
])

初始$group从提供的“分组键”中获取$min$max值,这是文档中的"session"值。第二个$group在没有任何分组键(或null)的情况下完成,以便累积“所有内容”。

当你从另一个$subtract一个BSON日期时,结果就是以毫秒为单位的差异。这也是一般将数字转换为数值的处理方式。但您所做的只是$subtract$min$max输出的两个值,并将其输入$avg累加器。