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非关系型数据库_数据

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']