目录
一、非关系型数据库简介
nosql:全称not only sql,指非关系型数据库,随着访问量的上升,网站的数据库性能出现了问题,于是nosql被设计出来
优点:
高可扩展性
分布式计算
低成本
架构灵活,半结构化数据
没有复杂的关系
缺点:
没有标准化
有限的查询功能
不直观的程序
nosql分类:
1、列存储
代表:Hbase、cassandra,hypertable
特点:按列存储。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的io优势
2、文档存储
代表:mongoDB、couchDB
特点:文档存储一般用类似json的格式存储,存储的内容是文档型的这样也就有机会对某些字段建立索引,实现关系数据库的某些功能
3、key-value存储
代表:Tokyo Cabinet/Tyrant、Berkeley DB、MemcacheDB、Redis
特点:可以通过key快速查询到value。一般来说,存储不管value的格式,照单全收(radis包含了其他的功能)
4、图存储
代表:Neo4j、Versant
特点:图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便
5、对象存储
代表:db4o、Versant
特点:通过类似面向对象语言的语法操作数据库,通过对象的方式存储数据
6、xml数据库
代表:Berkeley DB XML,BaseX
特点:高效的存储xml数据,并支持xml的内部查询语法,比如Xquery,Xpath
二、MongoDB简介
一、什么是MongoDB ?
1、MongoDB是由C+语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加多的节点,可以保证服务器性能。
2、MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。
3、MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于JSON对象(BSON)。字段值可以包含其他文档,数组及文档数组。
二、主要特点
1、MongoDB的提供了一个面向文档存储,基本的思路就是将原来“行”的概念换成更加灵活的“文档”模型。一条记录可以表示非常复杂的层次关系,
2、Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
3、非常容易扩展。面对数据量的不断上涨、通常有两种方案,一种是购买更好的硬件,别一种是分散数据,进行分布式的扩展,前者有着非常大的缺点,因为硬作通常是有物理极限的。当达到极限以后,处理能力就不可进行扩展了,所以建议的方式是使用集群进行扩展。MongoDB所采用的面向文档的数据模型使其可以自动在多台服务器之间分割数据,它还可以平衡集群的效据和负载,自动重排文档。
4、MongoDB支持各种编程语言:RUBY,PYTHON、Java、C++、PHP,C#等多种语言。
5、丰富的功能,包括索引、存储JavaScript.、聚合、固定集合、文件存储等,
6、方便的管理,除了启动数据库的服务器外,几乎没有什么必要的管理操作。管理集群只需要知道有新增加的节点,就会自动集成和配置新节点
三、MongoDB安装
1、mac:brew install mongndb
npm install mongodb
2、windows:前往官网下载安装
官网链接:https://www.mongodb.com/
3、数据库:一个mongoDB中可以建立多个数据库,MongDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中
数据库也通过名字来标识。数据库名可以是满足以下条件大的任意UTF-8字符串:
1、不能是空字符串("")
2、不能含有空格、.、$、/、\和\0(空字符)
3、应全部小写
4、最多64字节
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库
admin:从权限的角度来看,这是"root"数据库。 要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器
local;这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config:当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关数据
4、文档:
4.1、概念:文档是mongodb中的最核心的概念,是其核心单元,我们可以将文档类比成关系型数据库中的每一行数据
多个键及其关联的值有序的放置在一起就是文档。MongoDB使用了BSON这种结构来存储数据和网络数据交换
BSON数据可以理解为在JSON的基础上添加了一些json中没有的数据类型
如果我们会JSON,那么BSON我们就已经掌握了一半了,至于新添加的数据类型后面介绍
4.2、例子:{name:"张三",age:20,hobby:["看书","旅游","唱歌"]}
4、3注意:文档中的键值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以
是其他几种数据类型(甚至可以是整个嵌入的文档。
MongoDB区分类型和大小写
MongoDB的文档不能有重划的健
文档的键是学符串,除了少数例外情况,键可以使用任意utf-8字符
4.4、文档命名规范:
键不能含有\0(空字符)。这个字符用来表示键的结尾
和$有特别的意义,只有在特定环境下才能使用
以下划线"_"开头的键是保留的
5、集合:
5.1、集合就是一组文档的集合。如果将文档类比为数据库中的行,那么集合就可以类比为数据库中的表
5.2、在MongDB中的集合是无模式的,也就是说集合中存储的文档结构可以是不同的。
5.3、当第一个文档插入时,集合就会被创建
5.4、合法的集合名:
集合名不能是空字符串""
集合名不能含有\0(空字符),这个字符表示集合名的结尾
集合名不能以"system"开头,这是为系统集合保留的前缀
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则不要在名字中出现$
6、数据类型:
见图片
7、创建数据库:
启动服务:在安装目录的bin目录下输入:mongod.exe --dbpath=F:\学习存放\untitled\数据库\mongoDB\data\db
黑屏终端使用:在bin目录输入mongo.exe
链接数据库:mongo.exe 或者输入mongo
8、启动服务:
mongodb默认使用执行mongod命令所处盘符根目录下的/data/db作为自己的数据存储目录
所以使用前可以自己新建一个目录
如果想修改默认的存储目录:输入mongod.exe --dbpath=想要存放的路径
关闭开启的服务直接关闭黑窗就行。
9、其它:
可视化操作界面:MongoChef/MongoDB compass(官方)
操作参考:https://blog.youkuaiyun.com/yichuanyanyu1991/article/details/84820583
四、MongoDB基本操作
一、操作mongodb数据库
1、创建数据库 语法:use 数据库名 注意:如果数据库不存在则创建数据库,否则切换到指定的数据库 如果刚刚创建的数据库不在列表内,若需要显示,则需要向刚创建的数据库插入数据(db.student.insert({name:"tom",age:18,gender:1,address:"北京",isDelete:0}))
2、删除数据库: 前提:使用当前数据库(use 数据库名) db.dropDatabase()
3、查看所有数据库: show dbs
4、查看当前正在使用的数据库: a、db b、db.getName()
5、断开连接: exit
6、查看命令api: help
二、集合操作
1、查看当前数据库下有哪些集合 show collections
2、创建集合 a、 语法:db.createCollection("集合名") 示例:db.createCollection("class") b、 语法:db.集合名.insert(document) 示例:db.student.insert({name:"tom",age:18,gender:1,address:"北京",isDelete:0}) 区别:两者区别在于,前面一种方法创建的是空的集合,后面的方法是创建一个空的集合并添加一个文档
3、删除当前数据库中的集合 语法:db.集合名.drop() 示例:db.class.drop()
三、文档操作
1、插入文档:
a、使用insert()方法插入文档
语法:db.集合名.insert(doucument)
插入一个:db.student.insert({name:"lilei",age:19,gender:1,address:"北京",isDelete:0})
语法:db.集合.insert([文档1,文档2.....文档n])
插入多个:db.student.insert([{name:"韩梅梅",age:17,gender:0,address:"北京",isDelete:0},{name:"露西",age:20,gender:0,address:"上海",isDelete:0}])
b、使用save()方式插入文档
语法:db.集合名.save(文档)
说明:如果不指定_id字段,save()方法类似于insert()方法。如果指定_id字段,则会更新_id字段的数据
示例1:db.student.save({name:"poi",age:22,gender:1,address:"深圳",isDelete:0})
示例2:db.student.save({_id:ObjectId("5d525481e546ba4e07adda4f"),name:"poi",age:23,gender:1,address:"深圳",isDelete:0})
2、文档更新:
a、update()方法用于更新已经存在的文档
语法:
db.集合名.update(
query,
update,
{
upset:<booleab>,
multi:<boolean>,
writeConcern:<document>
}
)
参数说明:
query:update的查询条件,类似于sql里update语句内where后面的内容
update:update的对象和一些更新的操作符($set,$inc)等,$set直接更新,$inc在原有的基础上累加后更新
upset:可选,如果不存在update的记录,是否当新数据插入,true为插入,False为不插入,默认为false
multi:可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就按照条件查找出来的数据全部更新
writeConcern:可选,抛出异常的级别
需求:将lilei的年龄更新为25
示例1:db.student.update({name:"lilei"},{$set:{age:25}}) #set为将原来的值替换为给定的值
示例2:db.student.update({name:"lilei"},{$inc:{age:25}}) #inc为将给的值累加到原来的值上
示例3: db.student.update({name:"poi"},{$set:{age:25}},{multi:true}) #全改
b、save()方法通过传入的文档替换已有文档
db.集合名.save(
document,
{
writeConcern:<document>
}
)
参数说明:
document:文档数据
writeConcern:可选,抛出异常的级别
3、文档删除:
说明:在执行remove()函数前,先执行find()命令来判断执行的条件是否存在是一个良好习惯
语法:
db.集合名.remove(
query,
{
justOne:<boolean>,
writeConcern:<document>
}
参数说明:
query:可选,删除的文档的条件
justOne:可选,如果为true或1,则只删除一个文档
writeConcern:可选,抛出异常的级别
示例1:db.student.remove({name:"tom"})
示例2:db.student.remove({name:"poi"},{justOne:true}) #只删除一个poi
4、文档查询
a、find()方法
查询集合下所有的文档(数据)
示例:db.student.find()
b、find()方法查询指定列
语法:db.集合名.find(
query,
{
<key>:1
<key>:1
}
参数说明:
query:查询条件
key:要显示的字段
示例:
db.student.find({gender:1},{name:1,age:1})
db.student.find({},{name:1,age:1})
c、pretty()方法以格式化的方式来显示文档
示例:db.student.find().pretty()
d、findOne方法查询匹配结果的第一条数据
示例:db.student.find({gender:0})
5、查询条件操作符
作用:条件操作符用于比较两个表达式并从mongDB集合中获取数据
a、大于操作符 - $gt
语法:db.集合.find({<key>:{$gt:<value>}})
示例:db.student.find({age:{$gt:20}}) #年龄大于20
b、大于等于 -$gte
语法:db.集合.find({<key>:{$gte:<value>}})
示例:db.student.find({age:{$gte:20}}) #年龄大于等于20
c、小于 -$lt
语法:db.集合.find({<key>:{$lt:<value>}})
d、小于等于 -$lte
语法:db.集合.find({<key>:{$lte:<value>}})
e、大于等于和小于等于 -$gte 和 $lte
语法:db.集合.find({<key>:{$gte:<value>,$lte:<value>}})
f、等于 -:
语法:db.集合.find({<key>:<value>}})
g、使用_id进行查询
语法:db.student.find({"_id":ObjectId("id值")})
示例:db.student.find({"_id":ObjectId("5d525308e546ba4e07adda4d")})
h、查询某个结果集的数据条数
db.student.find().count()
i、查询某个字段的值当中是否包含另一个值
语法:db.student.find({name:/设定值/})
示例: db.student.find({name:/ile/})
j、查询某个字段的值是否以另一个值开头
语法:db.student.find({name:/^设定值/})
示例: db.student.find({name:/^韩/})
6、条件查询 and 和 or
a、AND条件:
语法:db.集合名.find({条件1,条件2.....条件n})
示例:db.student.find({gender:0,age:{$gt:16}}) #年龄大于16的女生
b、OR条件
语法:
db.集合名.find(
{
$or:[{条件1},{条件2},...,{条件n}]
}
)
示例:db.student.find({$or:[{age:17},{age:{$gte:20}}]})
c、AND 和 OR 联合使用
语法:
db.集合名.find(
{
条件1,
条件2,
$or:[{条件1},{条件2}]
}
)
7、limit、skip
a、limit():读取指定数量的数据记录
db.student.insert([{name:"韩梅梅3",age:17,gender:0,address:"北京",isDelete:0},{name:"露西3",age:20,gender:0,address:"上海",isDelete:0}])
db.student.find().limit(3)
b、skip():跳过指定数量的数据
db.student.find().skip(3)
c、skip与limit联合使用
通常用这种方式来实现分页功能
示例:db.student.find().skip(3).limit(3)
8、排序:
语法:db.集合名.find().sort({<key>:1|-1})
示例:db.student.find().sort({age:1})
注意:1表示升序,-1表示降序
五、在python中操作MongoDB
1、添加文档
from pymongo import MongoClient
#连接服务器
conn = MongoClient("localhost",27017)
#连接数据库
db = conn.mydb
#获取集合
collection = db.student
#添加文档
collection.insert([{"name":"lc","age":22,"gender":0,"address":"昆明","isDelete":0},{"name":"dx","age":22,"gender":0,"address":"会泽","isDelete":0}])
#断开
conn.close()
2、查询文档
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId #用于id查询
#连接服务器
conn = MongoClient("localhost",27017)
#连接数据库
db = conn.mydb
#获取集合
collection = db.student
#查询文档
#查询部分文档
'''
res = collection.find({"age":{"$gt":18}})
for row in res:
print(row)
print(type(row)) #字典类型
'''
#查询所有文档
'''
res = collection.find()
for row in res:
print(row)
print(type(row))
'''
#统计查询:
'''
res = collection.find({"age":{"$gt":18}}).count()
print(res)
'''
#根据id查询
'''
res = collection.find({"_id":ObjectId("5d5251d9e546ba4e07adda4c")})
print(res[0])
'''
#排序
'''
#res = collection.find().sort("age") #升序
res = collection.find().sort("age",pymongo.DESCENDING) #降序
for row in res:
print(row)
'''
#分页查询
res = collection.find().skip().limit(5)
for row in res:
print(row)
#断开
conn.close()
3、更新文档
from pymongo import MongoClient
#连接服务器
conn = MongoClient("localhost",27017)
#连接数据库
db = conn.mydb
#获取集合
collection = db.student
#更新文档
collection.update({"name":"lilei"},{"$set":{"age":25}})
#断开
conn.close()
4、删除文档
from pymongo import MongoClient
#连接服务器
conn = MongoClient("localhost",27017)
#连接数据库
db = conn.mydb
#获取集合
collection = db.student
#更新文档
collection.remove({"name":"poi"})
#全部删除
#collection.remove()
#断开
conn.close()