如何在PyMongo中查询列表中存在于MongoDB的日期
高效批量查询MongoDB中存在的日期
嘿,这个问题我太懂了!你现在逐个调用find_one查询确实会在日期数量多的时候拖慢效率——毕竟每查一次就要和数据库建立一次交互,次数多了开销就上去了。其实MongoDB原生就支持批量匹配查询,用$in操作符就能一次性搞定所有查询,不用再循环啦。
核心解决方案:使用$in操作符
$in操作符的作用是匹配字段值位于指定数组内的所有文档。你只需要把mylist作为参数传给$in,一次查询就能把所有符合条件的文档都捞出来,相比多次请求数据库,效率提升不是一点半点。
修改后的代码示例
先修复你原代码里的一个小bug:中间那两行d = collection.find_one({})和d1 = collection.find_one({})会覆盖用户输入的日期,得删掉!然后替换掉逐个查询的部分:
import datetime import re import pymongo from datetime import timedelta, date def daterange(d, d1): for n in range(int ((d1 - d).days)): yield d + timedelta(n) # 连接数据库 uri = "mongodb://127.0.0.1:27017" client = pymongo.MongoClient(uri) database = client['db'] collection = database['currency'] # 获取用户输入 d = input('Insert beginning date (yyyy-mm-dd): ') d1 = input('Insert end date (yyyy-mm-dd): ') # 验证输入的日期是否存在(可选,但能避免后续转换出错) item = collection.find_one({"date" : d}) item1 = collection.find_one({"date" : d1}) if not item or not item1: print("起始或结束日期在数据库中不存在,请重新输入!") exit() # 转换为日期对象 dataObject = datetime.datetime.strptime(item['date'], "%Y-%m-%d") dataObject1 = datetime.datetime.strptime(item1['date'], "%Y-%m-%d") # 生成日期范围列表 mylist = [] for single_date in daterange(dataObject, dataObject1): date_str = single_date.strftime("%Y-%m-%d") mylist.append(date_str) print(date_str) print("\n生成的日期列表:", mylist) # 批量查询数据库中存在的日期对应的文档 existing_docs = list(collection.find({"date": {"$in": mylist}})) # 提取存在的日期(如果只需要日期字符串) existing_dates = [doc["date"] for doc in existing_docs] print("\n数据库中存在的日期:") for date in existing_dates: print(date) print("\n对应的完整文档:") for doc in existing_docs: print(doc)
为什么这样更高效?
- 减少数据库交互次数:原来N个日期要发N次请求,现在只需要1次,大幅降低网络开销和数据库连接成本。
- 利用MongoDB的查询优化:
$in操作符会被MongoDB优化处理,如果你的date字段建了索引,查询速度还会再上一个台阶(推荐给date字段加个索引哦,执行collection.create_index("date")即可)。
内容的提问来源于stack exchange,提问作者Filipe Varandas
相关产品推荐
相关产品推荐

