Python操作三大数据库- MongoDB数据库

1. MongoDB的介绍

1.1 介绍

  1. 了解MongoDB数据库
    MongoDB数据库与其他NoSQL数据库的区别。
  2. 安装MongoDB及客户端
    安装MongoDB数据库,安装RoBo3T客户端。
  3. 掌握MongoDB用户管理
    有哪些内置角色?
    如何创建用户?

1.2 MongoDB的介绍与安装

  1. NoSQL数据库简介
    NoSQL泛指非关系型数据库。随着Web2.0Web3.0技术的兴起,传统关系型数据库无法应对如此巨大的数据存储和处理。所以非关系型(NoSQL)数据库得以发展。
    注意:① 关系型数据库有严谨的数据模型和验证机制,不会被NoSQL数据库取代,适合保存高价值的数据。NoSQL数据库适合保存海量低价值的数据。两者之间是互补的关系。② NoSQL数据库无法做表连接。
  2. MongoDB数据库简介
    MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库中功能最丰富,最像关系型数据库的产品。
    注意:Redis利用内存来缓存数据,MongoDB利用硬盘来存储数据。Redis可存储数据速度更快,MongoDB可存储数据体积更大。
  3. MongoDBC++编写而成,性能良好,可以安装在多种系统上。
  4. MongoDB安装、配置以及操作介绍

1.3 总结

  1. 了解MongoDB数据库的特点
  2. 掌握安装MongoDB的方法
  3. 掌握MongoDB的用户管理

2. MongoDB的基本操作

2.1 介绍

  1. 数据的查询
    表达式、条件查询、分页、排序、去除重复
  2. 数据的写入
    添加数据、修改数据、删除数据
  3. 管理索引
    创建索引、查看索引、删除索引

2.2 MongoDB的增删改查

  1. 掌握数据查询
  2. 掌握数据的写入
  3. 掌握索引机制

3. 数据的导入导出

  1. 掌握mongoexport导出数据集合
  2. 掌握mongoimport导入数据集合
  3. 掌握mongodump导出逻辑库数据
  4. 掌握mongorestore导入逻辑库数据

4. MongoDB与Python交互

4.1 介绍

  1. 安装pymongo模块
    pip安装pymongo模块
  2. 学习pymongoCRUD
    查询数据、添加数据、修改数据、删除数据
  3. 学习GridFS引擎
    GridFS存储机制,文件的保存、查询、提取和删除

4.2 MongoDB与Python的交互

  1. Python语言有很多操作MongoDB的模块,其中pymongo是特别常用的驱动模块。
    文档:https://api.mongodb.com/python/current/tutorial.html
  2. 安装pymongo
    pip3 install pymongo
    如果安装失败可以使用镜像路径-i https://pypi.doubanio.com/simple
  3. 创建连接
    MongoClientMongoDB的客户端代理对象,可以用来执行增删改查操作,并且内置了连接池。
from pymongo import MongoClient

client = MongoClient(host='localhost', port=27017)
client.school.authenticate('school', 'school')
  1. 数据写入
    insert_oneinsert_many两个函数可以向MongoDB写入数据。
from mongodb.mongo_db import client

try:
    client.school.teacher.insert_one({'name': '李璐'})
    client.school.teacher.insert_many([
        {'name': '陈刚'},
        {'name': '郭丽丽'}
    ])
except Exception as e:
    print(e)
  1. 数据查询
    find_onefind两个函数可以从MongoDB中查询数据。
from mongodb.mongo_db import client

try:
    teachers = client.school.teacher.find({})
    for one in teachers:
        print(one["_id"], one["name"])
        # 5e3e7a4a81ba17404ca286dd 李璐
        # 5e3e7a4a81ba17404ca286de 陈刚
        # 5e3e7a4a81ba17404ca286df 郭丽丽
    teacher = client.school.teacher.find_one({'name': '陈刚'})
    print(teacher["_id"], teacher["name"])
    # 5e3e7a4a81ba17404ca286de 陈刚
except Exception as e:
    print(e)
  1. 数据修改
    update_oneupdate_many两个函数可以修改MongoDB数据。
from mongodb.mongo_db import client

try:
    client.school.teacher.update_many({}, {'$set': {'role': ['班主任']}})
    client.school.teacher.update_one({'name': '李璐'}, {'$set': {'sex': '女'}})
    client.school.teacher.update_one({'name': '郭丽丽'}, {'$push': {'role': '年级主任'}})
except Exception as e:
    print(e)
  1. 数据删除
    delete_onedelete_many两个函数可以删除MongoDB数据。
from mongodb.mongo_db import client

try:
    client.school.teacher.delete_one({'name': '李璐'})
    client.school.teacher.delete_many({})
except Exception as e:
    print(e)
  1. 其他操作
    skip - 跳过指定数量
    limit - 限制数量
    count - 查询数量
    distinct - 查询不重复的字段值
    sort - 对记录排序
from mongodb.mongo_db import client

try:
    client.school.student.insert_many([
        {'name': '陈刚', 'age': 20},
        {'name': '郭丽丽', 'age': 22},
        {'name': '陈刚', 'age': 10},
    ])
    students = client.school.student.find({}).skip(1).limit(2)
    for one in students:
        print(one['name'])  # 郭丽丽 陈刚
    students = client.school.student.distinct('name')
    print(students)  # ['陈刚', '郭丽丽']
    students = client.school.student.find({}).sort([('age', -1)])
    for one in students:
        print(one['name'])  # 郭丽丽 陈刚 陈刚
except Exception as e:
    print(e)
  1. 文件存储
    存储在硬盘上:最简单,但不适用于分布式部署环境。
    存储在文件服务器上:NAS可以存放大量文件,并能应对分布式环境,但对文件管理不方便。
    存储在NoSQL数据库:普通SQL数据库不适合存储文件,但MongoDB提供了文件存储。
  2. GridFS存储引擎
    GridFSMongoDB的文件存储方案,主要用于存储超过16M(BSON文件限制)的文件(如:图片、音频等),对于大文件有着更好的性能。
    注释:MongoDB中单个文档(document)存储大小限制为16M
  3. GridFS存储原理
    GridFS使用两个集合来存储文件,一个是chunks集合,用来存放文件;另一个集合是file,用于存储文件的元数据。
    GridFS会把文件分割成若干chunks(256KB),然后在files记录他们。
  4. 使用GridFS存储文件
from mongodb.mongo_db import client
from gridfs import GridFS

db = client.school
gfs = GridFS(db, collection='book')
file = open('/Users/nimengwei/Downloads/Node.js开发指南.pdf', 'rb')
args = {'type': 'PDF', 'keyword': 'node'}
gfs.put(file, filename='Node.js开发指南', **args)
file.close()
image.png
  1. 查询GridFS中存储的文件
    findfind_one函数可以查询GridFS中存储的文件。
from mongodb.mongo_db import client
from gridfs import GridFS
import math
import datetime

db = client.school
gfs = GridFS(db, collection='book')

book = gfs.find_one({'filename': 'Node.js开发指南'})
print(book.filename, book.type, book.keyword)  # Node.js开发指南 PDF node
print('%dM'%math.ceil(book.length / 1024 / 1024))  # 9M

books = gfs.find({'type': 'PDF'})
for one in books:
    # UTC转换成北京时间
    uploadDate = one.uploadDate + datetime.timedelta(hours=8)
    # 格式化日期
    uploadDate = uploadDate.strftime('%Y-%m-%d %H:%M:%S')
    print(one._id, one.filename, uploadDate)
    # 5e3ec3177c30f29b4bfe1265 Node.js开发指南 2020-02-08 22:18:00
  1. 判断是否存储了文件
    exists函数可以判断GridFS是否存储某个文件。
from mongodb.mongo_db import client
from gridfs import GridFS
from bson.objectid import ObjectId

db = client.school
gfs = GridFS(db, collection='book')

rs = gfs.exists(ObjectId('5e3ec3177c30f29b4bfe1265'))
print(rs)  # True
rs = gfs.exists(**{'filename': '123.html'})
print(rs)  # False
rs = gfs.exists(**{'type': 'PDF'})
print(rs)  # True
  1. 读取文件
    get函数可以从GridFS中读取文件,并且只能通过主键查找文件。
from mongodb.mongo_db import client
from gridfs import GridFS
from bson.objectid import ObjectId

db = client.school
gfs = GridFS(db, collection='book')

document = gfs.get(ObjectId('5e3ec3177c30f29b4bfe1265'))
file = open('/Users/nimengwei/Downloads/Node.js开发指南copy.pdf', 'wb')
file.write(document.read())
file.close()
  1. 删除文件
    delete函数可以从GridFS中删除文件,并且只能先通过主键查找记录。
from mongodb.mongo_db import client
from gridfs import GridFS
from bson.objectid import ObjectId

db = client.school
gfs = GridFS(db, collection='book')

gfs.delete(ObjectId('5e3ec3177c30f29b4bfe1265'))

4.3 总结

  1. 技能清单
    学习pymongo模块的CRUD函数
    掌握了用GridFS引擎存储文件

5. 开发新闻管理系统

  1. 学习目标
    (1) 完成新闻正文的编写
    wangEditor插件编写HTML格式的新闻正文,保存成文件。
    (2) 完成新闻正文的存储
    添加新闻、修改新闻、删除新闻、审批新闻
  2. 代码地址
    https://github.com/nmwei/database-vega
  3. 总结
    (1) MySQL
    关系型:保存关系复杂的高价值数据。
    (2) Redis
    高速缓存:缓存经常被读取的热数据。
    (3) MongoDB
    非关系型:保存海量低价值的数据。
    (4) 新闻管理系统
    实战案例:利用Python结合三种数据库。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容