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 概念 | 说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 表 → 集合(无固定列) |
| row | document | 行 → 文档(JSON) |
| column | field | 列 → 字段 |
二、连接过程(对比 MySQL 的 pymysql.connect)
-
创建客户端
client = pymongo.MongoClient(host, port)这一步只建立 TCP 连接,并不选库。
-
选库
db = client[db_name] # 字典式写法 -
选集合(表)
col = db[collection_name] # 同样用字典 -
执行命令
集合对象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. 选库再选集合
- 第一个
conn是MongoClient实例; conn[db_config['db']]→ 选数据库;- 再
[db_config['db']]→ 选同名集合(库名 = 集合名,这里写法特殊,正常一般是两个不同名字)。
四、四个分支动作
-
insertresult = conn.insert_one(query) # query 是一个 Python dict return result.inserted_id # 返回新文档的 _id -
findcursor = conn.find(query) # 返回游标对象 list(cursor) # 迭代取出所有文档 pd.DataFrame(...) # 转 DataFrame 再 to_dict -
deleteresult = conn.delete_one(query) # 只删第一条匹配 return result.deleted_count # 实际删除条数 -
updateresult = 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)
六、常见坑提醒
- 字段名大小写敏感;
- 必须加
$set,否则会把整个文档替换成只保留更新字段; - “_id” 是主键,自动创建,全局唯一;
- find 返回的是游标,遍历时才真去服务器拿数据,别直接
print(cursor)。
记住四步:
连接数据库 → 选库 → 选集合 → 调方法,就能上手 MongoDB。
七、两者操作之间的区别
| 操作维度 | MySQL(关系型) | MongoDB(文档型) | 关键差异提示 |
|---|---|---|---|
| 连接 | pymysql.connect(...) | MongoClient(host, port) | Mongo 先建客户端,再选库 |
| 选库 | connection.db_name 或 USE db_name | client[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=1 | col.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=1 | col.update_one({"a":1},{"$set":{"b":3}}) | 必须 $set 否则整行替换 |
| 删除 | DELETE FROM tbl WHERE a=1 | col.delete_one({"a":1}) | 默认只删第一条匹配 |
| 事务 | 自动/手动 BEGIN/COMMIT | 4.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-connector | pymongo, motor(异步) | 均支持 SQLAlchemy 上层 |
