mongodb查询语句:
db.service_call_log.aggregate([
{
$match: {
"startTime": {
"$gte": ISODate("2018-01-06 23:54:50"),
"$lt": ISODate("2018-01-06 23:59:51")
}
}
},
{
$group: {
_id: "$serviceId",
count: {
$sum: 1
}
}
}
])
显示结果:
python代码:
# !/user/bin/env python3
# - * - coding:utf-8 - * -
from dateutil.parser import *
from pymongo import MongoClient
from random import randrange as rand
#连接mongodb数据库
cxn = MongoClient(host = '127.0.0.1', port = 27017)
users = cxn.test.service_call_log
COLSIZ = 39
#用空格将字段填充至制定长度
def tformat(s):return str(s).title().ljust(COLSIZ)
# 将单词首字母大写;ljust()左对齐,并使用空格填充直至达到指定长度
def cformat(s):return s.upper().ljust(COLSIZ)
FIELDS = (
'requestId', 'status', 'direction', 'result', 'startTime', 'endTime', 'serviceId')
FIELDS2=('_id','count')
#python无法直接 运行ISODate("2018-01-06 23:54:50"),会报错NameError: name 'ISODate' is not defined,需要用dateutil.parser.parse('2018-01-06 23:54:50')
myDatetime = parse('2018-01-06 23:54:50')
myDatetime2 = parse('2018-01-06 23:59:51')
#格式化显示标题行
print('\n%s' % ''.join(map(cformat, FIELDS)))
#输出指定时间范围内的数据
for user in users.aggregate([
{'$match': {'startTime': {'$gte':myDatetime,'$lt':myDatetime2}}}
]):print(''.join(map(tformat, (user[k] for k in FIELDS))))
#输出指定时间范围内的以serviceId为统计指标的数据
print('\n%s' % ''.join(map(cformat, FIELDS2)))
for user in users.aggregate([
{'$match': {'startTime': {'$gte':myDatetime,'$lt':myDatetime2}}},
{'$group':{'_id':'$serviceId',
'count':{'$sum':1}
}}
]): print(''.join(map(tformat, (user[k] for k in FIELDS2))))
显示结果:
报错原因:
一般是语法错误引起,python中的mongoClient方法和直接用mongodb的语法是有一些不同的,可以参考下这篇《MongoClient—Python》文章中的一些基本示例,地址如下:
https://blog.youkuaiyun.com/jiuzhibuguniao/article/details/80457453