如何汇总和平均两个日期之间的时间?

时间:2017-08-31 21:14:01

标签: mongodb mongodb-query aggregation-framework

假设下面是我的元素结构。我如何SHELL查询mongodb并获得每次旅行在数据库中每次旅行所需的平均差异(平均长度)?我猜减去日期?但那么如何减去然后平均?

"_id": {
    "$oid": "5445ab058767000062"
},
"comment": null,
"scheduled_request": false,
"status": "blah",
"timestamp_started": {
    "$date": "2014-10-21T00:38:28.990Z"
},
"timestamp_transaction_complete": {
    "$date": "2014-10-21T00:49:12.990Z"
},
"user_id": "5445a9000057"

UDPATE ======== 这是我的查询

db.ambulance_requests.aggregate([
  { "$group": {
    "_id": null,
    "avg_time": {
      "$avg": {
        "$subtract": [
          "$timestamp_transaction_complete",
          "$timestamp_started"
        ]
      }
    }
  }}
])

和我的结果(来自Mac终端外壳):

{ "_id" : null, "avg_time" : 0 }

1 个答案:

答案 0 :(得分:1)

$subtract$avg将其应用于$group管道阶段。对于“所有内容”,请使用null作为分组键:

db.trips.aggregate([
  { "$group": {
    "_id": null,
    "avg_time": {
      "$avg": {
        "$subtract": [
          { "$ifNull": [ "$timestamp_completed", 0 ] },
          { "$ifNull": [ "$timestamp_started", 0 ] }
        ]
      }
    }
  }}
])

当您从另一个BSON Date对象$subtract时,差异将作为它们之间的毫秒间隔返回。这也是一种通常用于提取毫秒值以用于其他目的的技术。

您提供的单个文档:

{
    "comment" : null,
    "scheduled_request" : false,
    "status" : "blah",
    "timestamp_started" : ISODate("2014-10-21T00:38:28.990Z"),
    "timestamp_completed" : ISODate("2014-10-21T00:49:12.990Z"),
    "user_id" : "5445a9000057"
}

问题中单个文档的结果:

/* 1 */
{
    "_id" : null,
    "avg_time" : 644000.0
}