python和mongodb交互

前言

MongoDB是常用的非关系型数据库,在开发中经常用到。本文介绍MongoDB和Python结合使用的用法。

在Python代码中使用MongoDB数据库,首先需要安装第三方库:

cmd 复制代码
pip install pymongo

示例代码:

python 复制代码
# 导包
import pymongo

# 创建连接
mongo_client = pymongo.MongoClient(host='localhost', port=27017)

# 连接数据库和集合  database1是数据库名称 t2是集合名称
db = mongo_client['database1']['t2']

# 查询
results = db.find()

# 遍历查询结果
for item in results:
    print(item)
语法 操作 格式
$eq 等于 {:}
$lt 小于 {: {$lt:}}
$lt 小于或等于 {: {$lte:}}
$lt 大于 {: {$gt:}}
$lt 大于或等于 {: {$gte:}}
$lt 不等于 {: {$ne:}}
$lt {$and: [{}, {}]}
$lt {$or: [{}, {}]}
$lt 在范围内 {age: {$in: [val1, val2]}}
$lt 不在范围内 {age: {$nin: [val1, val2]}}

基本查询

查询集合中的第一条记录:

python 复制代码
db.find_one()

查询所有数据:

python 复制代码
db.find()

查询结果只显示某些字段,0表示不显示,1表示显示:

默认情况下 _id 字段是显示的,其他字段是不显示的。

python 复制代码
db.find({}, {"_id": 0, "name": 1, "age": 1})

条件查询:

python 复制代码
# 查询age字段值是28的数据
res = db.find({'age': 28})

# 查询age字段值大于28的数据
res = db.find({'age': {'$gt': 28}})

# 查询age字段值大于28的数据,并按照年龄从小到大排序,1是从小到大,-1是从大到小
res = db.find({'age': {'$gt': 28}}).sort({'age': 1})

# 查询age字段值大于28,并且city字段的值是深圳的数据(同时满足2个条件)
res = db.find({'$and': [
     {'age': {'$gt': 28}},
     {'city': '深圳'}
]})

# 查询age字段值大于30,或者city字段的值是深圳的数据(满足任意一个条件即可)
res = db.find({'$or': [
    {'age': {'$gt': 30}},
    {'city': '深圳'}
]})

# 查询occupation字段值包含经理的数据(正则表达式-模糊查询)
res = db.find({'occupation': {'$regex': '经理'}})

聚合查询

以性别分组:

python 复制代码
db.aggregate([
	{"$group": {"_id": "$gender"}}  # 以性别分组
])

'''
{'_id': '女'}
{'_id': '男'}
'''

以性别分组,分组后年龄求和:

python 复制代码
db.aggregate([
	{"$group": {"_id": "$gender", "sum_age": {"$sum": "$age"}}}  # 以性别分组,分组后年龄求和
])

'''
{'_id': '男', 'sum_age': 294.0}
{'_id': '女', 'sum_age': 271.0}
'''

以性别分组,分组后求个数(出现的次数):

python 复制代码
db.aggregate([
    {"$group": {"_id": "$gender", "count": {"$sum": 1}}}
])

"""
{'_id': '女', 'count': 10}
{'_id': '男', 'count': 10}
"""

以性别分组,分组后年龄求平均值:

python 复制代码
db.aggregate([
    {"$group": {"_id": "$gender", "avg_age": {"$avg": "$age"}}}
])

'''
{'_id': '女', 'avg_age': 27.1}
{'_id': '男', 'avg_age': 29.4}
'''

以性别分组,分组后把年龄放到一起:

python 复制代码
results = self.db.aggregate([
    {
        "$group": {
            "_id": "$gender",
            "age": {"$push": "$age"}
        }
    }
])

'''
{'_id': '男', 'age': [28.0, 32.0, 35.0, 27.0, 26.0, 24.0, 28.0, 34.0, 29.0, 31.0]}
{'_id': '女', 'age': [25.0, 29.0, 22.0, 31.0, 33.0, 30.0, 26.0, 23.0, 27.0, 25.0]}
'''
名称 描述
$avg 求平均值
$min 求最小值
$max 求最大值
$sum 求和
$push 放到一起
$count 计数
相关推荐
孟健9 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞11 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽13 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程18 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪18 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook18 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战1 天前
Pydantic配置管理最佳实践(一)
python