PyMongo:操作MongoDB的Python库

想操作 MongoDB 数据库,用 Python 咋整?PyMongo 就是个好帮手。它就是 MongoDB 官方开发的 Python 驱动,能让咱们用 Python 代码来操作 MongoDB 数据库。啥增删改查、索引管理、聚合查询,统统都能搞定。说白了,就是给 MongoDB 穿上了一件 Python 外套。

连接数据库先整起来
装库用这个命令:pip install pymongo。来看看咋连接数据库:



from pymongo import MongoClient

# 连接 MongoDB
client = MongoClient('mongodb://localhost:27017/')

# 选择数据库
db = client['my_database']

# 选择集合(就是表)
collection = db['my_collection']

温馨提示:要是连不上数据库,检查下 MongoDB 服务是不是启动了。要是要连云数据库,记得把连接串里的用户名密码改对喽。

增删改查都不难
MongoDB 最基本的操作就是 CRUD(增删改查),来看看咋用:



# 插入一条数据
data = {"name": "张三", "age": 25, "hobby": ["足球", "篮球"]}
result = collection.insert_one(data)
print(f"插入的 ID: {result.inserted_id}")

# 查找数据
query = {"name": "张三"}
doc = collection.find_one(query)
print(doc)

# 更新数据
new_values = {"$set": {"age": 26}}
collection.update_one(query, new_values)

# 删除数据
collection.delete_one(query)

这代码看着挺多,其实就是把数据当字典用,该咋整就咋整。

批量操作更给力
一条条处理太慢了,来点批量操作:



# 批量插入
docs = [
    {"name": "张三", "age": 25},
    {"name": "李四", "age": 30},
    {"name": "王五", "age": 35}
]
result = collection.insert_many(docs)

# 批量查询
cursor = collection.find({"age": {"$gt": 25}})
for doc in cursor:
    print(doc)

# 批量更新
collection.update_many(
    {"age": {"$lt": 30}},  # 条件:年龄小于 30
    {"$inc": {"age": 1}}   # 年龄加 1
)

温馨提示:批量操作要注意内存占用,数据太多的话最好分批处理。cursor 用完记得关闭,不然可能会内存泄露。

聚合查询有点东西
想统计下数据?聚合管道就是干这个的:



pipeline = [
    # 筛选年龄大于 25 的
    {"$match": {"age": {"$gt": 25}}},
    
    # 按年龄分组,计算每个年龄的人数
    {"$group": {
        "_id": "$age",
        "count": {"$sum": 1},
        "names": {"$push": "$name"}
    }},
    
    # 排个序
    {"$sort": {"_id": 1}}
]

results = list(collection.aggregate(pipeline))

聚合管道看着吓人,其实就是一个个操作连起来,数据从一个管道流到另一个管道,每个管道都会对数据做点处理。

玩 PyMongo 有几个坑得注意:

1. ObjectId 不能直接转成字符串,得用 str()转换

2. 时间字段要用 datetime 类型,不能用字符串

3. 查询结果是 cursor 对象,遍历完就没了,要想重复用得转成列表

4. 索引得提前建好,不然查询可慢死了

对了,还有个小技巧:要是想看 MongoDB 生成的原生查询语句,可以用 explain()方法:


collection.find({"age": {"$gt": 25}}).explain()

这样就能知道 MongoDB 咋执行你的查询的,优化查询的时候特别有用。写查询的时候记得先用这个看看执行计划,免得写出特别慢的查询来。

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...