问题现象描述
在使用Facebook Prophet库的get_holidays_for_countries_and_years_mongodb方法时,开发者经常会遇到以下典型错误:
pymongo.errors.ServerSelectionTimeoutError: connection to MongoDB server failed [Errno 61] Connection refused
该问题通常发生在以下场景:本地开发环境首次连接MongoDB、生产环境服务迁移、或者权限配置变更后。错误信息表明Prophet无法通过指定参数建立与MongoDB数据库的连接通道。
根本原因分析
通过拆解方法调用链,我们发现连接失败主要涉及四个关键环节:
- 网络层问题:防火墙阻止27017默认端口或MongoDB服务未启动
- 认证配置错误:用户名/密码包含特殊字符时未正确URL编码
- URI格式不规范:缺少必需的
authSource参数或使用了错误的协议前缀 - Prophet版本兼容性:v1.1+版本对PyMongo驱动有特定版本要求
解决方案
1. 验证MongoDB服务状态
首先执行基础检查命令:
# Linux/macOS sudo systemctl status mongod telnet localhost 27017 # Windows Get-Service -Name MongoDB
2. 修正连接字符串格式
正确的URI应包含以下要素:
mongodb://username:password@host:port/database?authSource=admin
Python代码示例:
from prophet.make_holidays import get_holidays_for_countries_and_years_mongodb
uri = "mongodb://admin:%23SpecialPass@127.0.0.1:27017/holidays?authSource=admin"
holidays_df = get_holidays_for_countries_and_years_mongodb(
countries=["US", "CN"],
years=[2023, 2024],
mongo_uri=uri,
ssl_cert_reqs="CERT_NONE" # 开发环境可禁用SSL验证
)
3. 配置白名单与防火墙
云服务环境下需特别注意:
- AWS EC2安全组开放入站规则
- MongoDB Atlas网络访问列表添加当前IP
- 阿里云/腾讯云配置安全组策略
4. 升级依赖版本
版本冲突常见于:
pip install --upgrade pymongo==4.2.0 prophet==1.1.4
5. 启用详细日志
通过PyMongo日志定位问题:
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('pymongo')
logger.setLevel(logging.DEBUG)
6. 测试连接独立脚本
编写隔离测试脚本验证基础连接:
from pymongo import MongoClient
def test_mongo_connection(uri):
try:
client = MongoClient(uri, serverSelectionTimeoutMS=5000)
client.server_info() # 触发实际连接
return True
except Exception as e:
print(f"Connection failed: {str(e)}")
return False
性能优化建议
成功连接后,可通过以下配置提升查询效率:
- 设置
maxPoolSize=50参数控制连接池大小 - 添加
retryWrites=true参数启用自动重试 - 对
country_code和year字段建立复合索引