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 计数
相关推荐
梅雅达编程笔记5 小时前
编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)
开发语言·人工智能·python·numpy·pandas
zhz52146 小时前
GIS项目中空间参考转换与MBTiles偏移:问题成因、解法与避坑
python·vue·gis
KaMeidebaby7 小时前
卡梅德生物技术快报|如何制备单克隆抗体:小众禽类靶点单抗制备实操流程:双载体抗原交叉筛选完整工艺记录
人工智能·python·深度学习·算法·机器学习
乱写代码7 小时前
Pydantic学习--BaseModel
python
fu15935745687 小时前
【边缘计算实战】P1:从零搭建边云任务卸载仿真实验台(Python 可复现)
数据库·python·边缘计算
蜡台8 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
智能体与具身智能8 小时前
TVA 本质内涵与核心特征(系列)
人工智能·python·智能体视觉
云雾J视界9 小时前
SST:高频变压器设计实战:铁氧体 vs 纳米晶 vs 非晶,磁性材料怎么选
python·acdc·dab·sst
第一程序员9 小时前
Rust trait 入门:把 AI 客户端抽象成可替换接口
python·rust·github
Ulyanov9 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头