You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:45:44