当前位置: 首页 > news >正文

MongoDB | python操作MongoDB的基础使用

  • 代码
    def mgd_sql(self,action:str,query:dict,update_query=None):'''Mongodb 数据库操作接口:param action: 操作类型 : 'insert'  'find'  'delete' 'update':param query: 查询条件:param update_query: 更新 用于 'update':return: 操作结果'''if action not in ( 'insert',  'find' , 'delete' ,'update'):raise ValueError("Invalid action. Must be one of  ['insert',  'find' , 'delete' ,'update']")try:with self as connect:db_config = self.config[self.section]# conn[db_config['db']] → 选数据库 [db_config['cn']] → 选集合collection = connect[db_config['db']][db_config['cn']]if action == 'insert':result = collection.insert_one(query)return result.inserted_id  # 返回新文档的 _idelif action == 'find':# find 返回的是游标,遍历时才真去服务器拿数据return pd.DataFrame(list(collection.find(query))).to_dict(orient='records')elif action == 'delete':result = collection.delete_one(query)return result.deleted_count  # 实际删除条数elif action == 'update':result = collection.update_one(query,{'set':update_query})  # 更新操作符,$set 表示“字段赋值”return result.modified_countexcept Exception as e:logger.error(e) # 写入日志信息raise EnvironmentError(f"执行  MongoDB语句失败 :{action}")

把这段代码拆开讲,你就明白 MongoDB 的“连接 → 选库 → 选表 → 增删改查”四步是怎么走的了。


一、MongoDB 和 MySQL 的对应关系(先建立直观印象)

MySQL 概念MongoDB 概念说明
databasedatabase数据库
tablecollection表 → 集合(无固定列)
rowdocument行 → 文档(JSON)
columnfield列 → 字段

二、连接过程(对比 MySQL 的 pymysql.connect

  1. 创建客户端

    client = pymongo.MongoClient(host, port)
    

    这一步只建立 TCP 连接,并不选库。

  2. 选库

    db = client[db_name]          # 字典式写法
    
  3. 选集合(表)

    col = db[collection_name]     # 同样用字典
    
  4. 执行命令
    集合对象 col 自带方法:
    insert_one, find, delete_one, update_one
    返回结果里带 inserted_id, deleted_count, modified_count 等字段。


三、逐句拆解你给的代码

with self as conn:                      # 1. 进入上下文,拿到 MongoClientdb_config = self.config[self.section]conn = conn[db_config['db']][db_config['db']]   # 2. 选库再选集合
  • 第一个 connMongoClient 实例;
  • conn[db_config['db']] → 选数据库;
  • [db_config['db']] → 选同名集合(库名 = 集合名,这里写法特殊,正常一般是两个不同名字)。

四、四个分支动作

  1. insert

    result = conn.insert_one(query)   # query 是一个 Python dict
    return result.inserted_id         # 返回新文档的 _id
    
  2. find

    cursor = conn.find(query)         # 返回游标对象
    list(cursor)                      # 迭代取出所有文档
    pd.DataFrame(...)                 # 转 DataFrame 再 to_dict
    
  3. delete

    result = conn.delete_one(query)   # 只删第一条匹配
    return result.deleted_count       # 实际删除条数
    
  4. update

    result = conn.update_one(query,                         # 匹配条件{'$set': update_query}         # 更新操作符,$set 表示“字段赋值”
    )
    return result.modified_count
    

五、最小可运行demo(本地有 MongoDB 时)

from pymongo import MongoClientclient = MongoClient('localhost', 27017)
col  = client['testdb']['student']     # 库 testdb,集合 student# 插入
_id = col.insert_one({"name": "张三", "age": 20}).inserted_id
print("插入ID:", _id)# 查询
for doc in col.find({"age": {"$gte": 18}}):   # age >= 18print(doc)# 更新
print("更新条数:", col.update_one({"name": "张三"}, {"$set": {"age": 21}}).modified_count)# 删除
print("删除条数:", col.delete_one({"name": "张三"}).deleted_count)

六、常见坑提醒

  1. 字段名大小写敏感
  2. 必须加 $set,否则会把整个文档替换成只保留更新字段;
  3. “_id” 是主键,自动创建,全局唯一;
  4. find 返回的是游标,遍历时才真去服务器拿数据,别直接 print(cursor)

记住四步:
连接数据库 → 选库 → 选集合 → 调方法,就能上手 MongoDB。

七、两者操作之间的区别

操作维度MySQL(关系型)MongoDB(文档型)关键差异提示
连接pymysql.connect(...)MongoClient(host, port)Mongo 先建客户端,再选库
选库connection.db_nameUSE db_nameclient[db_name]字典式语法
选表/集合cursor = conn.cursor()
FROM table_name
db[collection_name]无模式,无需建表
数据格式行(Row)固定列文档(JSON/BSON)字段可随意增减
插入INSERT INTO tbl(a,b) VALUES (1,2)col.insert_one({"a":1,"b":2})自动建集合/主键 _id
查询SELECT * FROM tbl WHERE a=1col.find({"a":1})条件即 JSON
条件运算符WHERE age >= 18 AND name LIKE "A%"{"age":{"$gte":18},"name":{"$regex":"^A"}}操作符以 $ 开头
排序ORDER BY age DESC.find().sort("age",-1)1 升序 -1 降序
聚合GROUP BY + COUNT()col.aggregate([{$group:{_id:"$dept",cnt:{$sum:1}}}])管道式聚合
更新UPDATE tbl SET b=3 WHERE a=1col.update_one({"a":1},{"$set":{"b":3}})必须 $set 否则整行替换
删除DELETE FROM tbl WHERE a=1col.delete_one({"a":1})默认只删第一条匹配
事务自动/手动 BEGIN/COMMIT4.0+ 支持,需副本集早期版本无事务
主键PRIMARY KEY AUTO_INCREMENT自动 _id (ObjectId)全局唯一,可自定义
索引CREATE INDEX idx ON tbl(col)col.create_index([("col",1)])支持复合/文本/地理索引
表结构变更ALTER TABLE ... ADD COLUMN无需,直接插入新字段无模式 Schema-less
常用驱动pymysql, mysql-connectorpymongo, motor(异步)均支持 SQLAlchemy 上层
http://www.dtcms.com/a/609544.html

相关文章:

  • 【C++进阶】异常
  • 《非暴力沟通》马歇尔•卢森堡博士(美)
  • Rust 从零到精通:构建一个专业级命令行工具 greprs
  • 大足网站建设网络营销市场调研的内容
  • CSS3 分页技术解析
  • HTMLElement 与MouseEvent 事件对象属性详解
  • 建设网站都要学些什么手续拍卖网站模板下载
  • 【火语言RPA实战案例】根据ISBN 编码批量查询孔夫子书籍信息,自动导出本地 Excel(附完整脚本)
  • 从零开始理解状态机:C语言与Verilog的双重视角
  • 做软件常用的网站有哪些软件微信怎么做网站推广
  • 设计模式面试题(14道含答案)
  • [智能体设计模式] 第9章 :学习与适应
  • 肇庆市建设局网站西双版纳建设厅网站
  • LingJing(灵境)桌面级靶场平台新增:真实入侵复刻,知攻善防实验室-Linux应急响应靶机2,通关挑战
  • 融合尺度感知注意力、多模态提示学习与融合适配器的RGBT跟踪
  • 基于脚手架微服务的视频点播系统-脚手架开发部分Fast-dfs,redis++,odb的简单使用与二次封装
  • 构建高可用Redis:哨兵模式深度解析与Nacos微服务适配实践
  • Linux -- 线程同步、POSIX信号量与生产者消费者模型
  • 微服务重要知识点
  • 东莞seo建站排名昆山有名的网站建设公司
  • 主从服务器
  • Linux 文件缓冲区
  • Node.js中常见的事件类型
  • Nacos的三层缓存是什么
  • 交通事故自动识别_YOLO11分割_DRB实现
  • 用flex做的网站空间注册网站
  • Vue + Axios + Node.js(Express)如何实现无感刷新Token?
  • 重大更新!Ubuntu Pro 现提供长达 15 年的安全支持
  • 重庆做学校网站公司农村服务建设有限公司网站
  • 尝试本地部署 Stable Diffusion