码迷,mamicode.com
首页 > 数据库 > 详细

python查询mongodb内数据

时间:2017-11-03 11:23:50      阅读:363      评论:0      收藏:0      [点我收藏+]

标签:数据库   读取   写入   errors   日期格   通话   _id   查询条件   logs   

初学者,写的不好请指出。

#第一步以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内数据

标签:数据库   读取   写入   errors   日期格   通话   _id   查询条件   logs   

原文地址:http://www.cnblogs.com/wuhl-89/p/7776779.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!