2017-08-31 292 views
0

假设下面是我的元素结构。我怎样才能SHELL查询mongodb并获得每次旅行在db中的每次旅行所花费的平均差异(平均长度)?我猜测减去日期?但那么如何减去,然后平均?如何汇总和平均两个日期之间的时间?

"_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终端Shell):

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

回答

0

$subtract$avg通过将它们应用于流水线阶段。对于“一切”,用null为分组键:

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

当你$subtract从另一个BSON Date对象,不同的是返回它们之间的间隔毫秒。这也是用于提取毫秒值用于其他目的的通常方便的技术。作为提供

您的单个文档:

{ 
    "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 
} 
+0

我矮波他和该avg_time为0?我知道这并不准确。 {“_id”:null,“avg_time”:0} – jdog

+0

@jdog事实上,它甚至不可能,如果我使用问题中提供的数据,那么我当然会得到两个日期之间的差异。你正在做一些不正确的事情。在你的问题中显示更多的文档,并使用实际的mongo shell输出,而不是从IDE转储,或者从你的位置获取序列化格式。 –

+0

查看上面的更新。 – jdog

相关问题