如何通过IP地址读写现有MongoDB?PyMongo连接及操作问题
PyMongo连接MongoDB及集合操作问题解决
报错1:collection_names()方法不存在
问题原因
PyMongo 3.7+版本已移除database.collection_names()方法,改用database.list_collection_names()替代,调用旧方法会触发类型错误。
修复方法
将代码中的print(db.collection_names())替换为print(db.list_collection_names())
报错2:ServerSelectionTimeoutError(无法连接服务器)
问题原因
目标MongoDB为副本集配置,但客户端尝试解析副本集内部主机名(mongodb)失败,导致无法建立连接。需强制客户端直连指定IP节点,而非尝试发现整个副本集。
修复方法
创建MongoClient时添加directConnection=True参数,同时确保:
- 公司防火墙允许你的Windows 11机器访问目标MongoDB的27017端口
- 目标MongoDB实例的绑定IP包含
196.xxx.xxx.xxx(而非仅绑定内部IP)
完整实现代码
1. 列出cloud_db数据库下的所有集合
import pymongo # 连接MongoDB,添加directConnection=True强制直连指定节点 client = pymongo.MongoClient("mongodb://196.xxx.xxx.xxx:27017", directConnection=True) # 输出所有数据库列表 print("现有数据库列表:", client.list_database_names()) # 连接cloud_db数据库 db = client.cloud_db # 输出cloud_db下的所有集合 print("cloud_db中的集合列表:", db.list_collection_names())
2. 对eform_detail集合进行读写操作
import pymongo client = pymongo.MongoClient("mongodb://196.xxx.xxx.xxx:27017", directConnection=True) db = client.cloud_db eform_col = db.eform_detail # 写入单条数据示例 new_form = { "form_id": "TEST_EF_001", "title": "测试表单", "content": "表单测试内容", "create_time": "2024-05-20" } insert_result = eform_col.insert_one(new_form) print("插入文档ID:", insert_result.inserted_id) # 查询数据示例(按form_id过滤) for doc in eform_col.find({"form_id": "TEST_EF_001"}): print(doc) # 更新数据示例 update_result = eform_col.update_one( {"form_id": "TEST_EF_001"}, {"$set": {"content": "更新后的测试内容"}} ) print(f"成功更新{update_result.modified_count}条文档") # 删除数据示例 delete_result = eform_col.delete_one({"form_id": "TEST_EF_001"}) print(f"成功删除{delete_result.deleted_count}条文档")
补充说明
- 若MongoDB开启身份验证,连接字符串格式为:
mongodb://用户名:密码@196.xxx.xxx.xxx:27017/?directConnection=True - 确保PyMongo版本为最新,可执行
pip install --upgrade pymongo更新
内容的提问来源于stack exchange,提问作者j ton
相关产品推荐
相关产品推荐

