mongoDB获取范围内数据删除不符合条件的数据聚合计算均值

查找一个时间范围的数据db['Copy(1)_of_20180401'].find({'t':{$gte:'2018-04-01 20:00:00'},'t':{$lte:'2018-04-01 21:00:00'}})取反后删除db['Copy(1)_of_20180401'].remove({'t':{$not:{$lte:'2018-04-01 22:00:00'}}})聚合计算平均值db['Copy(1)_of_20180401'].aggregate({"$group":{_id: 'avg',avg_value:{"$avg":"$uf"}}});这篇文章写的很全面:https://blog.csdn.net/zwq9123...

May 3, 2019 · 1 min · jiezi

使用pymongo解析文本格式日志后放入mongo

思路拿到的文本是二进制的,在查看文件的时候可以加上-rb以二进制读的形式打开。 文件格式如下: b’2019-03-29 10:55:00\t0\192.168.31.123:8080\t5\t12345678\t0\t44560\t953864\t2\t192.168.31.123\tmd5\n’可以看到日志里面的分隔符是制表符t,行末尾有换行符n 处理日志文件的基本逻辑 链接数据库逐行读txt将一行的数据分割为数组将数据放入list将list逐条转化为json存入数据库分片集群的mongo链接用于存储日志的mongo集群有三个分片:flux-stat-1.mongo:27017,flux-stat-2.mongo:27017和flux-stat-3.mongo:27017. 假设用户名是flux-stat,密码是flux-stat-mongo123,登录方法: from pymongo import MongoClientimport urllib.parse#创建MongoDB链接对象username = urllib.parse.quote_plus(‘flux-stat’)password = urllib.parse.quote_plus(‘flux-stat-mongo123’)uri = 'mongodb://%s:%s@flux-stat-1.mongo:27017, flux-stat-2.mongo:27017, flux-stat-3.mongo:27017/admin' % (username,password)client = MongoClient(uri)注意:username和password必须要进行转换,否则链接不正确 pymongo逐行读取日志文本with open(“d:/user/ServerLog/test.txt”,’rb’) as file: for line in file: #这里放操作file.close()分割日志内容转化为json,并把每行json放到数组中#引入json模块import jsontotal=[]logList = line.split(‘\t’) #line分割为listkeyList = [‘time’,’status’,’ip’,’type’,’userid’,’v1’,’v2’,’v3’,’v4’,’ip’,’md5’] #key的listlogDict = dict(zip(keyList, logList)) #把二者以字典的方式拼起来logJson = json.dumps(logDict) #把字典转换为string形式的json#json转字典的方法为dictinfo = json.loads(json_str)total.append(logJson)日志存入mongoinsert_one和insert_many是两种插入的方式,但是采用insert_one进行逐条插入会进行大量的访问,大幅降低插入效率,采用insert_many进行json为基本单位的list批量插入,效率明显提高。 db = client['log'] #获取数据库coll = db[‘data’] #获取表coll.insert_many(total) #插入到数据库

May 2, 2019 · 1 min · jiezi

Python MongoDB 一些聚合查询方法

MongoDB 的聚合查询语法一直让我难以很好的入门,如果不是因为项目需要,我很少会用到它,但是用多了之后,会越来越喜欢它,尤其是接触了一些聚合查询方法后,我发现 MongoDB 真的在业务中提高了不少效率。总之,MongoDB 真香~~~下面是我的一些平时使用聚合查询的记录data 集合数据格式{ “_id” : ObjectId(“5caef7f2c0cd2730919a038f”), “sn” : “1904010010000001”, “dev_id” : 200, “dt” : ISODate(“2036-02-07T14:29:00.000Z”), “data” : { “BT” : 20.0, “CSQ” : 23, “GPSLati” : 39.8679244, “GPSLongti” : 116.6568387, “Humidity” : 0.0, “Temprature” : 0.0, “Voltage” : 0.0 }}查询所有 sn 下的最新一条数据sn = [‘1904010010000001’, ‘1904010010000002’, ‘1904010010000003’]pipeline = [ {’$match’: {‘sn’: {’$in’: sn}}}, {’$group’: {’_id’: “$sn”, “data”: {’$last’: “$data”}, “dt”: {’$last’: “$dt”}}}, {’$sort’: {“dt”: 1}}]db.data.aggregate(pipeline)返回结果(避免数据过长,仅显示一个数据)[ { ‘_id’: ‘1812010009000100’, ‘data’: { ‘Ap’: 1009.7, ‘BT’: 20.0, ‘CSQ’: 24, ‘GPSLati’: 39.8681678, ‘GPSLongti’: 116.6591262, ‘Humidity’: 31.400000000000002, ‘Temprature’: 21.5, ‘Voltage’: 0.98, ‘WindDir’: 0, ‘WindSpeed’: 0.0 }, ‘dt’: datetime.datetime(2019, 4, 14, 17, 44) }]查询某个 sn 10 小时内每隔 10 分钟统计的平均值sn = ‘1904010010000001’pipeline = [ {’$project’: {‘date’: {’$substr’: ["$dt", 0, 15]}, ‘data’: ‘$data’}}, {’$group’: { ‘_id’: “$date”, ’temprature’: {’$avg’: ‘$data.Temprature’}, ‘humidity’: {’$avg’: ‘$data.Humidity’}, ‘wind_speed’: {’$avg’: ‘$data.WindSpeed’}, ‘wind_dir’: {’$avg’: ‘$data.WindDir’} }}, {’$limit’: 60}, {’$sort’: {’_id’: -1}}]db.data.aggregate(pipeline)返回结果(避免数据过长,仅显示一个数据)[ { ‘_id’: ‘2019-04-14T01:3’, ’temprature’: 10.861538461538462, ‘humidity’: 18.70769230769231, ‘wind_speed’: 0.49230769230769234, ‘wind_dir’: 167.6153846153846 }]原文地址: Python MongoDB 一些聚合查询方法我的博客: 时空路由器 ...

April 14, 2019 · 1 min · jiezi

pymong 游标超时:pymongo.errors.CursorNotFound: Cursor not found

前言从库批量抽取数据或数据集较大后续代码运行时间太长而导致游标超时运行env:python2.7pymongo==3.7.0mongodb:v3.6.6解决方案:设置连接永远不超时 client=pymongo.MongoClient(host=‘s3005.test.com’,port=3005, connect=False) db = client.test col =db.images_new cursor = readm_col.find({“image_cover”: 1},no_cursor_timeout=True) ## no_cursor_timeout设置连接永远不超时 try for data in cursor: pass ## 一些业务逻辑 except: errinfo = sys.exc_info() print errinfo finally: cursor.close() ## 手动关闭连接,释放资源Done

March 12, 2019 · 1 min · jiezi