python查询mongodb内数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python查询mongodb内数据相关的知识,希望对你有一定的参考价值。
初学者,写的不好请指出。
#第一步以insertTime为条件查询时间段内的数据
#第二部步可以选择是否再以通话Id为条件筛选第一步所查询出来的数据
#因为使用的是配置文件,所以首先在代码当前目录下创建一个配置文件,db.conf
代码:
1 import configparser 2 import pymongo 3 from pymongo import MongoClient 4 import time 5 6 print(‘以insertTime为条件查询;可以按通话id筛选数据‘) 7 count = 0 8 f = open(‘获取数据.txt‘, ‘w‘,encoding=‘utf-8‘) #在写入文件夹是会报编码格式错误,所以增加encoding=‘utf-8‘解决 9 cf =configparser.ConfigParser() 10 #读取当前目录下的配置文件db.conf 11 cf.read(‘db.conf‘) 12 get_start_time = cf.getint(‘mongodb‘,‘start_time‘) 13 get_end_time = cf.getint(‘mongodb‘,‘end_time‘) 14 get_call_id = cf.get(‘mongodb‘,‘call_id‘) 15 #将时间戳毫秒转换为秒,db内的时间戳为毫秒单位,python的time为秒单位,所以除以1000 16 s_local_time = time.localtime(get_start_time/1000) 17 e_local_time = time.localtime(get_end_time/1000) 18 #将秒转换为日期格式2017-01-01 12:00:00 19 s_time = time.strftime(‘%Y-%m-%d %H:%M:%S‘,s_local_time) 20 e_time = time.strftime(‘%Y-%m-%d %H:%M:%S‘,e_local_time) 21 22 print(‘数据库IP:‘,cf.get(‘mongodb‘,‘db_ip‘),‘\\n数据库Port:‘,cf.getint(‘mongodb‘,‘db_port‘)) 23 print(‘查询开始时间:‘,s_time,‘\\n查询结束时间:‘,e_time) 24 print(‘通话ID:‘,get_call_id) 25 client = MongoClient(cf.get(‘mongodb‘,‘db_ip‘),cf.getint(‘mongodb‘,‘db_port‘)) 26 print(‘****************************************************‘) 27 28 #异常处理,连接失败走except pymongo.errors.ServerSelectionTimeoutError并退出,成功走else路径。 29 try: 30 print(‘正在连接...‘) 31 client.database_names() #检查是否能获取到数据库列表,获取不到说明连接失败。 32 print(‘连接成功...‘) 33 print(‘****************************************************‘) 34 except pymongo.errors.ServerSelectionTimeoutError: 35 print(‘无法连接,请查看数据库是否启成功,或数据库IP和Port是否配置正确。‘) 36 print(‘****************************************************‘) 37 else: 38 # 输出数据库列表,循环输出 39 print(‘数据库名称列表:‘) 40 database_names_num = 1 #为数据库编号,从1开始,循环一次+1 41 for d_list in client.database_names(): 42 print(database_names_num,‘:‘,d_list) 43 database_names_num += 1 44 print(‘****************************************************‘) 45 while True: 46 #异常处理,如输入非整数走下一步except ValueError,重新开始循环。否则走else路径。 47 try: 48 num_1 = int(input(‘请以编号选择数据库:‘)) 49 except ValueError: 50 print(‘输入类型错误,请重新输入。‘) 51 print(‘****************************************************‘) 52 else : 53 #判断输入的编号是否大于数据库的数量,或小于1 54 if num_1 > len(client.database_names()) or num_1 < 1 : 55 print(‘没有找到这个数据库,请重新输入。‘) 56 print(‘****************************************************‘) 57 else: 58 #因数据库实际全部存在为一个列表内,索引从0开始,我们为数据库设置的编号为从1开始,所以需要-1 59 db = client[client.database_names()[num_1-1]] #数据库名称 60 print(‘****************************************************‘) 61 #print(db) 62 63 #列出数据库内集合列表,循环输出 64 print(‘数据库内集合列表:‘) 65 collection_names_num = 1 #为集合编号,从1开始,循环一次+1 66 for c_list in db.collection_names(): 67 print(collection_names_num, ‘:‘,c_list ) 68 collection_names_num += 1 69 print(‘****************************************************‘) 70 71 while True: 72 # 异常处理,如输入非整数走下一步except ValueError,重新开始循环。否则走else路径。 73 try: 74 num_2 = int(input(‘请以编号选择数据库集合:‘)) 75 print(‘****************************************************‘) 76 except ValueError: 77 print(‘输入类型错误,请重新输入。‘) 78 print(‘****************************************************‘) 79 else: 80 # 判断输入的编号是否大于数据库内集合的数量,或小于1 81 if num_2 > int(len(db.collection_names())) or num_2 < 1: 82 print(‘没有找到这个集合,请重新输入。‘) 83 print(‘****************************************************‘) 84 #print(db.collection_names()) 85 else: 86 # 因数据库集合实际全部存在为一个列表内,索引从0开始,我们为数据库集合设置的编号为从1开始,所以需要-1 87 my_db = db[db.collection_names()[num_2-1]] 88 #print(my_db) 89 n = input(‘是否需要筛选通话id,输入“Y”或“N”:‘) 90 print(‘****************************************************‘) 91 print(‘开始运行...‘) 92 93 #这个循环分为3条路径,输入n,y个一条,然后输入别的任何字符走else路径,并重新循环 94 while True: 95 if n == ‘n‘ or n == ‘N‘: 96 s__time = time.clock() # 本地开始查询时间 97 #find查询条件,循环遍历集合,查询到符合条件的数据存到变量data 98 for data in my_db.find({"insertTime": {‘$gte‘: get_start_time, ‘$lte‘: get_end_time}}): 99 #print(data) 100 f.write(str(data) + ‘\\n‘) #写入文件内 101 count += 1 #统计共输出数据的条数,初始为0,循环一次+1 102 e__time = time.clock() #本地结束查询时间 103 #耗时等于结束时间减去开始时间 104 print(‘运行结束,共查询到‘, count, ‘条数据,共耗时‘,int(e__time - s__time), ‘秒。‘) 105 break 106 107 elif n == ‘y‘ or n ==‘Y‘: 108 # 开始运行时间 109 s__time = time.clock() # 本地开始查询时间 110 # find查询条件,循环遍历集合,查询到符合条件的数据存到变量data 111 for data in my_db.find({"insertTime": {‘$gte‘: get_start_time, ‘$lte‘: get_end_time}}): 112 #k为key,v为value,循环遍历data,查询value内含有通话ID的数据写入到文件 113 for k, v in data.items(): 114 if get_call_id in str(v): 115 #print(data) 116 f.write(str(data) + ‘\\n‘) 117 count += 1 #统计共输出数据的条数,初始为0,循环一次+1 118 e__time = time.clock() #本地结束查询时间 119 # 耗时等于结束时间减去开始时间 120 print(‘运行结束,共查询到‘, count, ‘条数据,共耗时‘, int(e__time - s__time), ‘秒。‘) 121 break 122 break 123 break 124 input(‘按回车键结束...‘)
以上是关于python查询mongodb内数据的主要内容,如果未能解决你的问题,请参考以下文章
(Python) 按日期查询,在 mongoDB 集合中存储为字符串