非关系型的数据库------ MongoDB

时间:2021-04-18 08:49:39

NoSQL简介

NoSQL,全名为Not Only SQL,指的是非关系型的数据库
随着访问量的上升,网站的数据库性能出现了问题,于是nosql被设计出来
优点1、高可扩展性2、分布式计算3、低成本4、架构的灵活性,半结构化数据5、没有复杂的关系
缺点1、没有标准化2、有限的查询功能(到目前为止)3、最终一致是不直观的程序
MongoDB将数据存储为一个文档,数据结构由键值(key=value)对 组成。
MongoDB文档类似于JSON对象,字段值可以包含其他文档、数组、文档数组。

MongoDB简介(文档型)    默认端口27017

1)MongoDB 是一个基于分布式,文件存储的NoSQL数据库。
2)由C++语言编写,运行稳定,性能高,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
3)MongoDB是为快速开发互联网web应用而设计的数据库系统。
4)MongoDB的设计目标是极简单、灵活、作为Web应用栈的一部分。
5)MongoDB的数据模型是面向文档的,所谓文档是一种类似JSON的结构,简单理解MongoDB这个数据库中存在的是各种各样的Json.
6)MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

分布式

分布式:一个业务分拆多个子业务,部署在不同的服务器上。
集群:同一个业务,部署在多个服务器上。
集群是个物理形态,分布式是个工作方式。

文档型(document)

就是一个对象,由键值对构成,是json的扩展Bson形式,是数据库中最小单位。文档对应着关系数据库表中的行
MongoDB特点
模式* :可以把不同结构的文档存储在同一个数据库里
面向集合的存储:适合存储 JSON风格文件的形式
完整的索引支持:对任何属性可索引
丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组
快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划
高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)

SQL和MongoDB术语/概名词对比

非关系型的数据库------ MongoDB

MongoDB的三元素

1、数据库(database)
数据库是一个仓库,在仓库中可以存放集合
2、 集合(collection)
类似于python的列表,在集合中可以存放文档;集合就是关系数 据库中的表。
3、文档(document)
就是一个对象,由键值对构成,是json的扩展Bson形式,是数据库中最小单位。

启动mongodb服务简写命令

sudo /usr/local/mongodb/bin/mongod --config /etc/mongodb.conf
sudo service mongod start
进入数据库:mongo

关闭mongodb服务

第一种方式:在mongodb中输入use admin和db.shutdownServer()
第二种方式:sudo service mongod stop

数据库操作

1. 查看所有数据库名称:列出所有在物理上存在的数据库show databases——>show dbs
2.创建数据库创建py3数据库:use py3 db.createCollection("名字")创建集合才显示3. 数据库切换(选择)use 数据库名称 use tset2
如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建
4. 查看当前数据库名称db
查看当前选择的数据库:db
显示集合(表):show collections
查看查看当前数据库信息db.states
查看集合的数据:db.sub.find({})
5. 数据库删除db.dropDatabase(){"dropped":"py3"}
删除当前指向的数据库,如果数据库不存在,则什么也不做。
集合创建
语法在某个数据库里面创建集合use python  db.createCollection(name, {options})
name是要创建的集合的名称
options是一个文档集合,用于指定集合的配置
删除集合db.students.drop()删除成功返回true,如果再删除返回false

数据基本操作

1. 插入 语法:db.stu.insert({"name":"郭靖"}) 集合不存在会创建
插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId
自己定义id是要写{_id:"2334566"}
2. 简单查询语法db.集合名称.find()或者 db.集合名称.find({})
3. 更新
db.集合名称.update({query},{update},{upsert: <boolean>,multi: <boolean>})
参数query:查询条件,类似sql语句update中where部分
参数update:更新操作符,类似sql语句update中set部分
参数upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入Newobject,true为插入,默认是false,不插入。
参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
默认值更新一条数据,并且结构被修改
db.stu.update({},{name:'mnc'})
默认值更新一条数据,只修改字段,不破坏数据
db.stu.update({},{$set:{name:'mnc'}})
指定属性更新,通过操作符$set数据结构不会被破坏,也是只修改一条
db.stu.update({name:'hr'},{$set:{name:'hys'}})
修改多条匹配到的数据多条操作一定要配合$set,否则会报错没有属性或添加
db.stu.update({},{$set:{gender:0}},{multi:true})
把所有name是hr修改成gj
db.stu.update({name:'hr'},{$set:{name:'gj'}},{multi:true})
4.保存语法
db.stu.save({_id:'20160102','name':'yk',gender:1})如果文档的_id已经存在则修改,如果文档的_id不存在则添加。注意,如果_id写成是id,则会把id当成key
5.删除语法
db.stu.remove({query},{justOne: boolean})
•参数query:可选,删除的文档的条件
•参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
全部删除没有写条件就是全部删除db.stu.remove({})
关于max的示例创建一个名为sub的定长集合,集合大小为5kb,可容纳的文档数为3
db.createCollection('sub',{capped:true,size:5,max:3})
在robomongo工具中和pymongo模块中:capped:封顶,结合size,max:3就是当第3条数据时,再插入数据覆盖之前插入的第1条数据给覆盖了,也就是说最多数据不能超过3条,也就是说数据只能存放3条。 注意在命令行中,会插入不进去,不会覆盖。

数据查询

方法find():查询db.stu.find({条件文档})
方法findOne():查询,只返回第一个文档db.stu.findOne({条件文档})
db.sub.findOne()只返回第一个文档
方法pretty():将结果格式化db.stu.find({条件文档}).pretty()
比较运算符
等于,默认是等于判断,没有运算符
小于$lt
小于或等于$lte
大于$gt
大于或等于$gte
不等于$ne
查询课时大于或等于2的学科db.sub.find({count:{$gte:2}})都是条件
查找标题不是mongo的学科db.sub.find({title:{$ne:'mongodb'}})
逻辑运算符 查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
逻辑与:默认是逻辑与的关系,多个条件直接用逗号连接
查询课时大于或等于10,并且标题为web的学科
db.sub.find({count:{$gte:10},title:"web"})
逻辑或:使用$or
查询课时大于10,或标题为web的学科
db.sub.find({$or:[{count:{$gt:10}},{title:'web'}]})
and和or一起使用
查询课时大于10或标题为web的学科,并且学科的课时为14
db.sub.find({$or:[{count:{$gte:10}},{title:'web'}],count:14})
范围运算符--"$in"
使用"$in","$nin" 判断是否在某个范围内
查询课时为8、14的学科db.sub.find({count:{$in:[8,14]}})
Limit与Skip
limit方法limit():用于读取指定数量的文档
db.stu.find().limit(NUMBER)
参数NUMBER表示要获取文档的条数
如果没有指定参数或者0则显示集合中的所有文档
skip方法skip():用于跳过指定数量的文档从n开始
语法:db.集合名称.find().skip(NUMBER)
参数NUMBER表示跳过的记录条数,默认值为0
案例1 从第二条开始,并且只要三条
db.sub.find().skip(2).limit(3)

创建数据集

for(i=0;i<10;i++){db.stu.insert({_id:i,name:'name_'+i})}
6.2.3 查询第5至8条数据
db.stu.find().limit(4).skip(5)

db.stu.find().skip(5).limit(4)
MongoDB与python交互
引入包pymongofrom pymongo import MongoClient

连接,创建客户端

#无安全认证:
client = MongoClient('localhost', 27017)
client = MongoClient('mongodb://localhost:27017/数据库名称')
client = MongoClient('mongodb://localhost:27017/test1')
#有安全认证:
client = MongoClient('mongodb://用户名:密码@localhost:27017/数据库名称')
client = MongoClient('mongodb://t1:123@localhost:27017/test1')
获得名字叫test1数据库db=client['test1']
得名字叫t1的集合t1 = db['t1']