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内数据的主要内容,如果未能解决你的问题,请参考以下文章

mongodb关联查询

python 插入数据到mongodb却查询不到数据

(Python) 按日期查询,在 mongoDB 集合中存储为字符串

mongodb怎么查询一天中24个小时内的各个数据集合

100天精通Python(进阶篇)——第40天:pymongo操作MongoDB数据库基础+代码实战

MongoDB - 在几个小时的时间范围内查询