常用数据库4 mongodb
知识内容:
1.mongodb介绍与基本使用
2.mongodb操作
一、mongodb介绍与基本使用
1.mongodb介绍
Mongodb是一款强大,灵活,且易于扩展的通用型数据库。它能扩展出非常多的功能,如二级索引,范围查询,排序,聚合,以及地理空间索引。MongoDB作为文档数据库,支持复杂的关系存储,更适合现在的web2.0时代
易于使用:
Mongodb是一个面向文档的数据库,而不是关系数据库,不采用关系模型主要是为了获得更好的扩展性,还有一些其他的好处。与关系型数据库相比,面向文档的数据库不再用行的概念,取而代之的是更为灵活的“文档(document)”,通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层次关系,这与使用现代面向对象语言的开发者对数据的看法一致。
易于扩展:
MongoDB的设计是采用横向扩展。面向文档的数据模型使他能很容易地在多台服务器之间进行数据分割。MongoDB能自动处理跨集群的数据和负载,自动重新分配文档,以及将用户请求路由到正确的机器上。
丰富的功能:
- 索引 MongoDB支持通用二级索引,允许多种快速查询,且提供唯一索引,复合索引,地理空间索引,以及全文索引
- 聚合 MongoDB支持聚合管道,用户能通过简单的片段创建复杂的聚合,并通过数据库自动优化。
- 特殊的集合类型 MongoDB支持存在时间有限的集合,适用于那些存在某个时刻过期的数据,如会话(session),类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志。
- 文件存储 MongoDB支持一种非常易用的协议,用于存储大文件和文件元数据。
2.mongodb安装及连接数据库
(1)下载
下载mongodb数据库服务端及mongodb数据库管理软件robomongo
(2)安装
就跟安装普通软件一样,robomongo自己去设置安装位置,Windows系统安装mongodb完后如下:
(3)运行服务器
在命令行中运行服务器程序 mongod.exe 出现如下错误
出现以下错误是因为缺少数据文件目录,按照上面的提示到C盘下新建data目录,然后再在data目录下新建db目录再重新运行程序,出现以下提示全部勾选上
成功运行服务器,现在正等待连接:
(4)连接服务器(连接数据库)
打开之前安装的robomongo软件,然后点击create 创建连接并点击save即可,然后选中连接并点击connect即可连接上数据库
连接上之后:
二、mongodb操作
1.连接数据库创建表(document)并插入数据
代码:
1 "" 2 注意,需要安装 pymongo 这个库 3 pip3 install pymongo 4 5 在你安装并开启 mongo 之后,就可以使用 pymongo 来连接使用 mongodb 了 6 """ 7 import pymongo 8 import random 9 10 # 连接 mongo 数据库, 主机是本机, 端口是默认的端口 11 client = pymongo.MongoClient("mongodb://localhost:27017") 12 print("成功连接数据库", client) 13 14 # 设置要使用的数据库 15 mongodb_name = 'mongo_demo' 16 # 直接这样就使用数据库了,相当于一个字典 -> 如果没有会自动创建 不需要我们自己去创建 (表也是一样) 17 # 下面这一句也可以这样写: db = client.mongo_demo 18 db = client[mongodb_name] 19 20 21 # 插入数据 22 # === 23 # mongo 中的 document 相当于 sqlite 中的 table 24 # 不需要定义,直接使用 25 # 不限定每条数据的字段 26 # 直接插入新数据,数据以字典的形式提供 27 # 下面的例子中, user 是文档名(表名),不存在的文档会自动创建 28 # 每个数据有一个自动创建的字段 _id,可以认为是 mongo 自动创建的主键 29 30 def insert(): 31 u = { 32 'name': 'wyb', 33 'note': 'admin', 34 '随机值': random.randint(0, 3), 35 } 36 db.user.insert(u) 37 38 39 insert()
运行一次上述代码,刷新robomongo,如下:
2.查询数据
1 import pymongo 2 3 # 连接 mongo 数据库, 主机是本机, 端口是默认的端口 4 client = pymongo.MongoClient("mongodb://localhost:27017") 5 print("成功连接数据库", client) 6 7 # 设置要使用的数据库 8 mongodb_name = 'mongo_demo' 9 db = client[mongodb_name] 10 11 12 # 查找数据 -> find 13 # find 返回一个可迭代对象,使用 list 函数转为数组 14 def find(): 15 user_list = list(db.user.find()) 16 print('所有用户: ') 17 for item in user_list: 18 print(item) 19 20 find() 21 22 # find 可以传入参数来做条件查询 23 # 具体可以很复杂 这里只演示简单的 24 # 查询随机值为 1 的所有数据 25 def find1(): 26 # 查询 随机值 等于1 的所有数据 27 query = { 28 '随机值': 1, 29 } 30 print('random 1: ', list(db.user.find(query))) 31 32 # 查询 随机值 等于1 并且 name等于xxx 的所有数据 33 query = { 34 '随机值': 1, 35 'name': 'xxx', 36 } 37 print('random 1 and name xxx: ', list(db.user.find(query))) 38 39 # 查询 随机值 大于 1 的所有数据 40 query = { 41 '随机值': { 42 '$gt': 1 43 }, 44 } 45 print('random > 1', list(db.user.find(query))) 46 47 # $or 查询 48 query = { 49 '$or': [ 50 { 51 '随机值': 2, 52 }, 53 { 54 'name': 'xxx' 55 } 56 ] 57 } 58 print('or 查询', list(db.user.find(query))) 59 60 # $gt -> 大于 61 # 此外还有 $lt $let $get $ne $or 等条件 62 # $lt -> 小于 $let -> 小于等于 $get -> 大于等于 $ne -> 不等于 $or -> 两种情况中至少满足一种 63 64 65 find1() 66 67 68 # 部分查询(指定区域) 69 # 部分查询, 相当于 select xx, yy from 表名 语句 70 def find_condition(): 71 query = {} 72 field = { 73 # 字段: 1 表示提取这个字段 74 # 不传的 默认是 0 表示不提取 75 'name': 1 76 } 77 print('部分查询,只查询name: ', list(db.user.find(query, field))) 78 79 80 find_condition()
3.更新、删除数据
1 import pymongo 2 import random 3 4 # 连接 mongo 数据库, 主机是本机, 端口是默认的端口 5 client = pymongo.MongoClient("mongodb://localhost:27017") 6 print("成功连接数据库", client) 7 8 # 设置要使用的数据库 9 mongodb_name = 'mongo_demo' 10 db = client[mongodb_name] 11 12 13 # 更新数据 14 # 默认更新第一条查询到的数据 15 def update(): 16 # 查找参数 17 query = { 18 '随机值': 1, 19 } 20 # 修改参数 21 form = { 22 '$set': { 23 'name': '更新后的name', 24 } 25 } 26 # db.user.update(query, form) 27 # 如果想要更新所有查询到的数据 28 # 需要加入下面的参数 {'multi': True} 29 options = { 30 'multi': True, 31 } 32 # 下面这一句相当于 db.user.update(query, form, multi=True) 33 db.user.update(query, form, **options) 34 35 36 # update() 37 38 39 # 删除 40 # === 41 # 删除和 find 是一样的 42 # db.user.remove()
4.注意
- 在程序中不会直接使用mongodb这些底层的操作,而是进行了封装,将底层逻辑封装成函数,就像上面一样
- 另外在程序中不会使用mongodb的原生数据库的删除,而是在数据库中的数据加一个字段"_deleted",该字段默认为False,删除就是将这个字段置为True
- 另外mongodb中的document(相当于表)中的字段不限制,可以随意添加任何不存在的字段,也就是说表中任意两项的字段可以是不一样的
1 # select_all 是给用户使用的查询函数 2 # 如果一个数据是被删除了的,那么这个数据的_delected字段就为True,那么这个数据就不会被查询到 3 def select_all(): 4 query = { 5 '_deleted': False, 6 } 7 user_list = list(db.user.find(query)) 8 res = [] 9 for u in user_list: 10 u.pop('_deleted') # 去掉_delected属性 11 us.append(u) # 把数据加入结果列表中 12 print('所有用户', len(res), res) 13 14 # select_all()