Python数据持久化-MongoDB篇

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 2018年7月6日笔记下文中的操作都是使用python操作mongoDB,所以前提是必须安装python和mongoDB。1. 安装pymongo在cmd或者PowerShell中运行命令:pip install pymongo2.

2018年7月6日笔记
下文中的操作都是使用python操作mongoDB,所以前提是必须安装python和mongoDB。

1. 安装pymongo

在cmd或者PowerShell中运行命令:pip install pymongo

2. 插入数据

2.1 插入一条数据

引入pymongo库中的MongoClient类,使用该类的初始化方法实例化一个对象赋值给conn
conn.myschool为数据库school,将其赋值给变量db
db.students为数据库school中的students集合,将其赋值给变量students
定义一个数据类型为字典dict的变量zhangsan
往数据库中的students集合中插入zhangsan的信息文档,students.insert_one(zhangsan)

from pymongo import MongoClient

if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.myschool
    students = db.students
    zhangsan = dict(
        name="zhangsan",
        age=20,
        sex="boy",
        contact=dict(
            email1="abc@qq.com",
            email2="123@qq.com"
        )
    )
    students.insert_one(zhangsan)

2.2 插入多条数据

from pymongo import MongoClient

if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.myschool
    students = db.students
    lisi = dict(
        name = 'lisi',
        habit = dict(
            habit1 = 'eat',
            habit2 = 'sleep'
        )
    )
    wangwu = dict(
        name = 'wangwu',
        age = 20,
        sex = 'boy'
    )
    students.insert_many([lisi,wangwu])

2.3 使用循环创建3个班,并随机添加10个学生

from pymongo import MongoClient
from random import randint
if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.school
    hobby_list = ['sing','drawing','run','football','basketball']
    grade_list = ['grade_1_1','grade_1_2','grade_1_3']
    for grade in grade_list:
        collection = db.get_collection(grade)
        collection.drop()
        for i in range(10):
            student = dict(
                name = "zhangsan" + str(i),
                age = randint(1,9),
                sex = "男" if randint(0,1) else "女",
                hobby = hobby_list[:randint(0,5)]
            )
            collection.insert_one(student)

3.查询数据

在进行查询的时候,必须要先执行2-3节中的代码,确保school数据库中插入3个班集合

3.1 查询集合中全部数据

示例代码如下:

from pymongo import MongoClient

if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.school
    students = db.grade_1_3
    cursor = students.find()
    for i in cursor:
        print(i)
图片.png-57.9kB
图片.png-57.9kB

3.2 过滤查询

查询之前先定义一个数据类型为字典dict的变量filter
filter示例,查询年龄等于4的文档:filter = {"age":4}
代码示例如下,代码能够成功运行,具体的数据库名和集合名要根据自己电脑中的MongoDB情况进行更改:

from pymongo import MongoClient

if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.school
    students = db.grade_1_3
    filter = {"age": 4}
    cursor = students.find(filter)
    for i in cursor:
        print(i)

filter中操作符及其含义


图片.png-131.5kB
图片.png-131.5kB

3.2.1 $in操作符示例:

from pymongo import MongoClient

if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.school
    students = db.grade_1_3
    filter = {"name": {'$in':['zhangsan2','zhangsan3']}}
    cursor = students.find(filter)
    for i in cursor:
        print(i)

上面一段代码的运行结果如下:

{'_id': ObjectId('5b3f0ea2ba50f64850ef1cda'), 'name': 'zhangsan2', 'age': 3, 'sex': '女', 'hobby': ['sing', 'drawing']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cdb'), 'name': 'zhangsan3', 'age': 3, 'sex': '男', 'hobby': ['sing', 'drawing', 'run', 'football']}

3.2.2 $gt操作符示例:

from pymongo import MongoClient

if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.school
    students = db.grade_1_3
    filter = {"age": {'$gt':4}}
    cursor = students.find(filter)
    for i in cursor:
        print(i)

上面一段代码的运行结果如下:

{'_id': ObjectId('5b3f0ea2ba50f64850ef1cd8'), 'name': 'zhangsan0', 'age': 7, 'sex': '女', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cd9'), 'name': 'zhangsan1', 'age': 5, 'sex': '女', 'hobby': ['sing', 'drawing', 'run', 'football']}

3.2.3 $gte操作符示例:

from pymongo import MongoClient

if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.school
    students = db.grade_1_3
    filter = {"age": {'$gte':4}}
    cursor = students.find(filter)
    for i in cursor:
        print(i)

上面一段代码运行结果如下:

{'_id': ObjectId('5b3f0ea2ba50f64850ef1cd8'), 'name': 'zhangsan0', 'age': 7, 'sex': '女', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cd9'), 'name': 'zhangsan1', 'age': 5, 'sex': '女', 'hobby': ['sing', 'drawing', 'run', 'football']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cdc'), 'name': 'zhangsan4', 'age': 4, 'sex': '女', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cdf'), 'name': 'zhangsan7', 'age': 4, 'sex': '女', 'hobby': ['sing', 'drawing']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1ce1'), 'name': 'zhangsan9', 'age': 4, 'sex': '女', 'hobby': ['sing', 'drawing', 'run']}

4.更新数据

4.1使用update_many函数

让所有文档中的sex字段都被修改为“男”。

from pymongo import MongoClient

if __name__ == '__main__':
    conn = MongoClient('localhost')
    db = conn.school
    students = db.grade_1_3
    filter = {"sex":"女"}
    updater = {"$set":{"sex":"男"}}
    students.update_many(filter,updater)
    cursor = students.find()
    for i in cursor:
        print(i)

上面一段代码的运行结果如下:

{'_id': ObjectId('5b3f0ea2ba50f64850ef1cd8'), 'name': 'zhangsan0', 'age': 7, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cd9'), 'name': 'zhangsan1', 'age': 5, 'sex': '男', 'hobby': ['sing', 'drawing', 'run', 'football']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cda'), 'name': 'zhangsan2', 'age': 3, 'sex': '男', 'hobby': ['sing', 'drawing']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cdb'), 'name': 'zhangsan3', 'age': 3, 'sex': '男', 'hobby': ['sing', 'drawing', 'run', 'football']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cdc'), 'name': 'zhangsan4', 'age': 4, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cdd'), 'name': 'zhangsan5', 'age': 1, 'sex': '男', 'hobby': ['sing', 'drawing', 'run', 'football']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cde'), 'name': 'zhangsan6', 'age': 2, 'sex': '男', 'hobby': ['sing']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1cdf'), 'name': 'zhangsan7', 'age': 4, 'sex': '男', 'hobby': ['sing', 'drawing']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1ce0'), 'name': 'zhangsan8', 'age': 1, 'sex': '男', 'hobby': ['sing', 'drawing']}
{'_id': ObjectId('5b3f0ea2ba50f64850ef1ce1'), 'name': 'zhangsan9', 'age': 4, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}

4.2 $inc操作符示例

让所有文档的age字段加2,即让集合grade_1_1中的所有人年龄加2

from pymongo import MongoClient

def printMongo(collection,filter={},num=3):
    cursor = collection.find(filter)
    for i in cursor[:num]:
        print(i)

if __name__ == "__main__":
    conn = MongoClient("localhost")
    db = conn.school
    students = db.grade_1_1
    printMongo(students)
    updater = {"$inc":{"age":2}}
    students.update_many({},updater)
    print("MongoDB更新数据后:")
    printMongo(students)

上面一段代码的运行结果如下:

{'_id': ObjectId('5b403bdc33514c04b891a363'), 'name': 'zhangsan0', 'age': 7, 'sex': '男', 'hobby': ['sing', 'drawing', 'run', 'football', 'basketball']}
{'_id': ObjectId('5b403bdc33514c04b891a364'), 'name': 'zhangsan1', 'age': 4, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b403bdc33514c04b891a365'), 'name': 'zhangsan2', 'age': 7, 'sex': '女', 'hobby': []}
MongoDB更新数据后:
{'_id': ObjectId('5b403bdc33514c04b891a363'), 'name': 'zhangsan0', 'age': 9, 'sex': '男', 'hobby': ['sing', 'drawing', 'run', 'football', 'basketball']}
{'_id': ObjectId('5b403bdc33514c04b891a364'), 'name': 'zhangsan1', 'age': 6, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b403bdc33514c04b891a365'), 'name': 'zhangsan2', 'age': 9, 'sex': '女', 'hobby': []}

4.3 $min操作符示例

与当前值进行比较,更新值为两者中的较小值
下面一段代码将所有age字段大于6的文档中的age字段修改为6

from pymongo import MongoClient

def printMongo(collection,filter={},num=5):
    cursor = collection.find(filter)
    for i in cursor[:num]:
        print(i)

if __name__ == "__main__":
    conn = MongoClient("localhost")
    db = conn.school
    students = db.grade_1_1
    printMongo(students)
    updater = {"$min":{"age":6}}
    students.update_many({},updater)
    print("MongoDB更新数据后:")
    printMongo(students)

上面一段代码的运行结果如下:

{'_id': ObjectId('5b403efd33514c189890748f'), 'name': 'zhangsan0', 'age': 4, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b403efe33514c1898907490'), 'name': 'zhangsan1', 'age': 9, 'sex': '男', 'hobby': []}
{'_id': ObjectId('5b403efe33514c1898907491'), 'name': 'zhangsan2', 'age': 1, 'sex': '男', 'hobby': ['sing']}
{'_id': ObjectId('5b403efe33514c1898907492'), 'name': 'zhangsan3', 'age': 7, 'sex': '女', 'hobby': ['sing', 'drawing', 'run', 'football']}
{'_id': ObjectId('5b403efe33514c1898907493'), 'name': 'zhangsan4', 'age': 2, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}
MongoDB更新数据后:
{'_id': ObjectId('5b403efd33514c189890748f'), 'name': 'zhangsan0', 'age': 4, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}
{'_id': ObjectId('5b403efe33514c1898907490'), 'name': 'zhangsan1', 'age': 6, 'sex': '男', 'hobby': []}
{'_id': ObjectId('5b403efe33514c1898907491'), 'name': 'zhangsan2', 'age': 1, 'sex': '男', 'hobby': ['sing']}
{'_id': ObjectId('5b403efe33514c1898907492'), 'name': 'zhangsan3', 'age': 6, 'sex': '女', 'hobby': ['sing', 'drawing', 'run', 'football']}
{'_id': ObjectId('5b403efe33514c1898907493'), 'name': 'zhangsan4', 'age': 2, 'sex': '男', 'hobby': ['sing', 'drawing', 'run']}

$currentDate操作符示例

添加的时间是按照0时区时间计时:比如本文作者实验时间为2018年7月7日12时28分(北京时间东8区),下面一段代码执行时记录的时间是2018年7月7日4时28分。

from pymongo import MongoClient

def printMongo(collection,filter={},num=2):
    cursor = collection.find(filter)
    for i in cursor[:num]:
        print(i)

if __name__ == "__main__":
    conn = MongoClient("localhost")
    db = conn.school
    students = db.grade_1_1
    printMongo(students)
    updater = {"$currentDate":{"create_time":True}}
    students.update_many({},updater)
    print("MongoDB更新数据后:")
    printMongo(students)

上面一段代码的运行结果如下:

{'_id': ObjectId('5b40413a33514c36d8a854ee'), 'name': 'zhangsan0', 'age': 8, 'sex': '女', 'hobby': ['sing', 'drawing']}
{'_id': ObjectId('5b40413a33514c36d8a854ef'), 'name': 'zhangsan1', 'age': 5, 'sex': '男', 'hobby': ['sing', 'drawing', 'run', 'football']}
MongoDB更新数据后:
{'_id': ObjectId('5b40413a33514c36d8a854ee'), 'name': 'zhangsan0', 'age': 8, 'sex': '女', 'hobby': ['sing', 'drawing'], 'create_time': datetime.datetime(2018, 7, 7, 4, 28, 0, 527000)}
{'_id': ObjectId('5b40413a33514c36d8a854ef'), 'name': 'zhangsan1', 'age': 5, 'sex': '男', 'hobby': ['sing', 'drawing', 'run', 'football'], 'create_time': datetime.datetime(2018, 7, 7, 4, 28, 0, 527000)}

5.删除数据

delete_many()函数用于删除多条数据
delete_one()函数用于删除一条数据

6.查询同时更新

三个可以利用来操作满足filter筛选条件的第一条文档的函数:
find_one_and_replace()
find_one_and_delete()
find_one_and_update()

作业

新建mongoDB数据库employee,里面有两个集合employee_info、employee_salary
(1)分别添加2个集合的数据
(2)查询employee_salary工资大于2000的;查询employee_info员工名称=xxx)
(3)修改employee_salary集合(将员工工资增加3000)
(4)删除员工aa的信息

4道小题合在一起的代码如下:

from pymongo import MongoClient

def printMongo(collection,filter={},num=2):
    cursor = collection.find(filter)
    for i in cursor[:num]:
        print(i)

if __name__ == "__main__":
    conn = MongoClient("localhost")
    db = conn.employee
    info = db.employee_info
    salary = db.employee_salary
    #第1小题
    info.drop()
    salary.drop()
    info.insert_one({"name":"aa","sex":"男","age":23})
    info.insert_one({"name":"bb","sex":"女","age":20})
    salary.insert_one({"name":"aa","salary":3000})
    salary.insert_one({"name": "bb", "salary": 1800})
    printMongo(info)
    printMongo(salary)
    # 第2小题
    filter = {"salary":{"$gt":2000}}
    print("找出工资大于2000的员工:")
    printMongo(salary,filter)
    filter2 = {'name':"bb"}
    print("找出姓名为bb的员工")
    printMongo(info,filter2)
    ##第3小题
    print("没有增加工资时:")
    printMongo(salary)
    updater = {"$inc":{"salary":3000}}
    salary.update_many({},updater)
    print("增加工资后:")
    printMongo(salary)
    ##第4小题
    print("没有删除员工aa时打印所有员工信息:")
    printMongo(info)
    printMongo(salary)
    print("删除员工aa后打印所有员工信息")
    info.delete_one({"name":"aa"})
    salary.delete_one({"name":"aa"})
    printMongo(info)
    printMongo(salary)

上面一段代码的运行结果如下:

{'_id': ObjectId('5b404b3333514c1dd0f6c096'), 'name': 'aa', 'sex': '男', 'age': 23}
{'_id': ObjectId('5b404b3333514c1dd0f6c097'), 'name': 'bb', 'sex': '女', 'age': 20}
{'_id': ObjectId('5b404b3333514c1dd0f6c098'), 'name': 'aa', 'salary': 3000}
{'_id': ObjectId('5b404b3333514c1dd0f6c099'), 'name': 'bb', 'salary': 1800}
找出工资大于2000的员工:
{'_id': ObjectId('5b404b3333514c1dd0f6c098'), 'name': 'aa', 'salary': 3000}
找出姓名为bb的员工
{'_id': ObjectId('5b404b3333514c1dd0f6c097'), 'name': 'bb', 'sex': '女', 'age': 20}
没有增加工资时:
{'_id': ObjectId('5b404b3333514c1dd0f6c098'), 'name': 'aa', 'salary': 3000}
{'_id': ObjectId('5b404b3333514c1dd0f6c099'), 'name': 'bb', 'salary': 1800}
增加工资后:
{'_id': ObjectId('5b404b3333514c1dd0f6c098'), 'name': 'aa', 'salary': 6000}
{'_id': ObjectId('5b404b3333514c1dd0f6c099'), 'name': 'bb', 'salary': 4800}
没有删除员工aa时打印所有员工信息:
{'_id': ObjectId('5b404b3333514c1dd0f6c096'), 'name': 'aa', 'sex': '男', 'age': 23}
{'_id': ObjectId('5b404b3333514c1dd0f6c097'), 'name': 'bb', 'sex': '女', 'age': 20}
{'_id': ObjectId('5b404b3333514c1dd0f6c098'), 'name': 'aa', 'salary': 6000}
{'_id': ObjectId('5b404b3333514c1dd0f6c099'), 'name': 'bb', 'salary': 4800}
删除员工aa后打印所有员工信息
{'_id': ObjectId('5b404b3333514c1dd0f6c097'), 'name': 'bb', 'sex': '女', 'age': 20}
{'_id': ObjectId('5b404b3333514c1dd0f6c099'), 'name': 'bb', 'salary': 4800}

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
2月前
|
存储 NoSQL MongoDB
【赵渝强老师】MongoDB写入数据的过程
在MongoDB数据更新时,WiredTiger存储引擎通过预写日志(Journal)机制先将更新写入日志文件,再通过检查点操作将日志中的操作刷新到数据文件,确保数据持久化和一致性。检查点定期创建,缩短恢复时间,并保证异常终止后可从上一个有效检查点恢复数据。视频讲解及图示详细说明了这一过程。
96 23
【赵渝强老师】MongoDB写入数据的过程
|
1月前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
152 83
|
3月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
469 10
|
18天前
|
JSON API 数据格式
Python 请求微店商品详情数据 API 接口
微店开放平台允许开发者通过API获取商品详情数据。使用Python请求微店商品详情API的主要步骤包括:1. 注册并申请API权限,获得app_key和app_secret;2. 确定API接口地址与请求参数,如商品ID;3. 生成签名确保请求安全合法;4. 使用requests库发送HTTP请求获取数据;5. 处理返回的JSON格式响应数据。开发时需严格遵循微店API文档要求。
|
14天前
|
数据采集 XML 存储
Python爬虫实战:一键采集电商数据,掌握市场动态!
这个爬虫还挺实用,不光能爬电商数据,改改解析规则,啥数据都能爬。写爬虫最重要的是要有耐心,遇到问题别着急,慢慢调试就成。代码写好了,运行起来那叫一个爽,分分钟几千条数据到手。
|
1月前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
17天前
|
JSON 监控 API
python语言采集淘宝商品详情数据,json数据示例返回
通过淘宝开放平台的API接口,开发者可以轻松获取商品详情数据,并利用这些数据进行商品分析、价格监控、库存管理等操作。本文提供的示例代码和JSON数据解析方法,可以帮助您快速上手淘宝商品数据的采集与处理。
|
1月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
56 12
|
23天前
|
数据采集 供应链 API
实战指南:通过1688开放平台API获取商品详情数据(附Python代码及避坑指南)
1688作为国内最大的B2B供应链平台,其API为企业提供合法合规的JSON数据源,直接获取批发价、SKU库存等核心数据。相比爬虫方案,官方API避免了反爬严格、数据缺失和法律风险等问题。企业接入1688商品API需完成资质认证、创建应用、签名机制解析及调用接口四步。应用场景包括智能采购系统、供应商评估模型和跨境选品分析。提供高频问题解决方案及安全合规实践,确保数据安全与合法使用。立即访问1688开放平台,解锁B2B数据宝藏!
|
1月前
|
数据采集 存储 前端开发
用Python抓取亚马逊动态加载数据,一文读懂
用Python抓取亚马逊动态加载数据,一文读懂

热门文章

最新文章