前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python数据持久化-MongoDB篇

Python数据持久化-MongoDB篇

作者头像
潇洒坤
发布2018-09-10 10:36:28
7100
发布2018-09-10 10:36:28
举报
文章被收录于专栏:简书专栏简书专栏

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)

代码语言:javascript
复制
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 插入多条数据

代码语言:javascript
复制
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个学生

代码语言:javascript
复制
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 查询集合中全部数据

示例代码如下:

代码语言:javascript
复制
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

图片.png-57.9kB

3.2 过滤查询

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

代码语言:javascript
复制
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

图片.png-131.5kB

3.2.1 $in操作符示例:
代码语言:javascript
复制
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操作符示例:
代码语言:javascript
复制
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操作符示例:
代码语言:javascript
复制
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字段都被修改为“男”。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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分。

代码语言:javascript
复制
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道小题合在一起的代码如下:

代码语言:javascript
复制
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}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 安装pymongo
  • 2. 插入数据
    • 2.1 插入一条数据
      • 2.2 插入多条数据
        • 2.3 使用循环创建3个班,并随机添加10个学生
        • 3.查询数据
          • 3.1 查询集合中全部数据
            • 3.2 过滤查询
              • 3.2.1 $in操作符示例:
              • 3.2.2 $gt操作符示例:
              • 3.2.3 $gte操作符示例:
          • 4.更新数据
            • 4.1使用update_many函数
              • 4.2 $inc操作符示例
                • 4.3 $min操作符示例
                • $currentDate操作符示例
                • 5.删除数据
                • 6.查询同时更新
                • 作业
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档