a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數據庫 > MongoDB > 正文

mongodb中按天進行聚合查詢的實例教程

2020-10-29 18:41:44
字體:
來源:轉載
供稿:網友

前言

最近在寫項目的時候遇到一個問題,使用mongodb記錄了用例的執行結果,但是在時間的記錄上使用的是date格式,現在有一個需求,以天為單位,統計一下每天成功的用例和失敗的用例,說到統計,肯定是要用到聚合查詢,但是如果以date格式的時間為group依據,那么等同于沒有分組,因為在記錄用例的時間幾乎不可能同時,今天查閱了一下相關文檔,可以使用mongodb的$dateToString命令來完成這個需求

問題來源

假如我們以如下的數據

/* 1 */{ "_id" : ObjectId("5d24c09651a456efbc231669"), "time" : ISODate("2019-07-08T10:12:35.125Z"), "result" : "Pass"}/* 2 */{ "_id" : ObjectId("5d24c09e51a456efbc23166a"), "time" : ISODate("2019-07-08T10:12:36.125Z"), "result" : "Pass"}....../* 10 */{ "_id" : ObjectId("5d24c0d851a456efbc231672"), "time" : ISODate("2019-07-06T10:10:52.125Z"), "result" : "Pass"}/* 11 */{ "_id" : ObjectId("5d24c0e751a456efbc231673"), "time" : ISODate("2019-07-06T10:10:52.125Z"), "result" : "Fail"}

我的預期結果是

{'_id': '2019-07-06', 'Pass': 1}
{'_id': '2019-07-06', 'Fail': 2}
{'_id': '2019-07-07', 'Pass': 2}
{'_id': '2019-07-07', 'Fail': 1}
{'_id': '2019-07-08', 'Pass': 2}
{'_id': '2019-07-08', 'Fail': 3}

如果按照以前的聚合方式,通過$time來分組,由于每個時間都不相同,所以這樣的聚合就相當于沒有聚合

#coding:utf-8from pymongo import MongoClientclient = MongoClient(host=['%s:%s'%("127.0.0.1",27017)])G_mongo = client['test']pipeline = [  {'$group': {'_id': '$time', 'count': {'$sum': 1}}}, ]for i in G_mongo['test'].aggregate(pipeline): print(i)

得到的結果

{'_id': datetime.datetime(2019, 7, 6, 10, 10, 32, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 7, 10, 10, 32, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 11, 22, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 6, 10, 10, 52, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 11, 32, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 12, 32, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 7, 10, 11, 22, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 12, 36, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 12, 35, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 7, 10, 10, 22, 125000), 'count': 1}

可以看到,由于$time上的時間,誰和誰都不一樣,所以如果以$time為分組對象的話每個統計都是1。

問題的解決

在分組的時候有一個$dateToString指令,可以將日期格式的值轉化為字符串,比如這里因為需求是要以天為單位,所以我將其轉為
%Y-%m-%d的字符串格式,具體的$grouop如下

{'$group': {'_id': {"$dateToString":{'format':'%Y-%m-%d','date':'$time'}}, 'count': {'$sum': 1}}}

$dateToString的說明文檔可以訪問https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/ 查看,簡單介紹一個

{ $dateToString: {  date: <dateExpression>,  format: <formatString>,  timezone: <tzExpression>,  onNull: <expression>} }

它需要四個參數,只有date參數是必須的,指定數據來源,format是轉化的格式,timezone為時區,onNull是如果日期值不存在時返回的值。

#coding:utf-8from pymongo import MongoClientclient = MongoClient(host=['%s:%s'%("127.0.0.1",27017)])G_mongo = client['test']pipeline = [    # {'$group': {'_id': '$time', 'count': {'$sum': 1}}},    {'$group': {'_id': {"$dateToString":{'format':'%Y-%m-%d','date':'$time'}}, 'count': {'$sum': 1}}}  ]for i in G_mongo['test'].aggregate(pipeline):  print(i)

上面代碼執行的結果如下

{'_id': '2019-07-06', 'count': 2}
{'_id': '2019-07-07', 'count': 3}
{'_id': '2019-07-08', 'count': 5}

這個看起來還不錯,但是離我的目標還差一點,因為它還沒有按照用例執行結果進行分組,再以天進行倒序排列

#coding:utf-8from pymongo import MongoClientclient = MongoClient(host=['%s:%s'%("127.0.0.1",27017)])G_mongo = client['test']pipeline = [    # {'$group': {'_id': '$time', 'count': {'$sum': 1}}},    {'$group': {'_id': {'date':{"$dateToString":{'format':'%Y-%m-%d','date':'$time'}},'result':'$result'}, 'count': {'$sum': 1}}},    {'$sort':{"_id.date":-1}}  ]for i in G_mongo['test'].aggregate(pipeline):  print(i)

得到的結果如下

{'_id': {'date': '2019-07-08', 'result': 'Fail'}, 'count': 3}
{'_id': {'date': '2019-07-08', 'result': 'Pass'}, 'count': 2}
{'_id': {'date': '2019-07-07', 'result': 'Pass'}, 'count': 2}
{'_id': {'date': '2019-07-07', 'result': 'Fail'}, 'count': 1}
{'_id': {'date': '2019-07-06', 'result': 'Fail'}, 'count': 1}
{'_id': {'date': '2019-07-06', 'result': 'Pass'}, 'count': 2}

查看文檔,除了使用$dateToString指令還可以使用$dayOfMonth指令

pipeline = [    {'$group': {'_id': {'date':{"$dayOfMonth":{'date':'$time'}},'result':'$result'}, 'count': {'$sum': 1}}},    {'$sort':{"_id.date":-1}},  ]

但是這個指令只能適用于單一月份,如果兩個月就會有交集,如7月6號和6月6號的會聚合到一起
上面得到的結果是

{'_id': {'date': 8, 'result': 'Fail'}, 'count': 3}
{'_id': {'date': 8, 'result': 'Pass'}, 'count': 2}
{'_id': {'date': 7, 'result': 'Pass'}, 'count': 2}
{'_id': {'date': 7, 'result': 'Fail'}, 'count': 1}
{'_id': {'date': 6, 'result': 'Pass'}, 'count': 2}
{'_id': {'date': 6, 'result': 'Fail'}, 'count': 1}

所以需要根據需求靈活的使用各種指令。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩精品一二三区 | 欧美精品二区三区四区免费看视频 | 久久精品国产久精国产 | 成人精品一区二区三区电影黑人 | 色噜噜视频 | 91精品久久久久久久99蜜桃 | 99精品免费久久 | 欧美日韩精品一区二区三区在线观看 | 亚洲精品免费在线播放 | 久久成| 女人第一次久久久www | 日本高清视频在线观看 | 爱爱视频天天操 | 欧美| aaa大片免费观看 | 久久生活片 | 午夜免费观看视频 | 91精品综合久久久久久五月天 | 黄色的网站在线免费观看 | 黄色操视频 | 日本黄色电影网址 | 中文成人av| 亚洲一区二区三区福利 | 啪啪网免费 | 亚洲专区在线播放 | 在线a视频网站 | 日韩精品在线观看视频 | 三区在线 | 国产精品视频 | 国产亚洲欧美在线 | 久久综合九九 | 综合久久综合久久 | 91社区在线观看高清 | 国产区在线 | 国产特黄 | 欧美一区二区在线视频 | 久久精品久久久久久久久久久久久 | 久久久久久免费毛片精品 | 成人一区av| 国产毛片在线 | 97在线观看 |