什么是NoSQL
在Web2.0时代,简单的关系型数据库固有的缺陷无法处理大数据,于是出现了新型的数据库,这些数据库不使用SQL接口操作数据库,所以称为NoSQL数据库
NoSQL数据库分类
- Key-value:memcache, redis
- 文档型:Mongodb
- 列式:hbase
- 图:neo4j
CAP理论
场景,即讨论背景为分布式系统
- Consistency:所有节点上的数据时刻保持同步
- Availability:每个请求都能接受到一个响应,无论成功还是失败
- Partition Tolerance:系统应该能持续提供服务
CAP理论说的是在一个分布式系统下,不存在任何分布式算法能满足三条
NoSQL特点
- 模式自由
- 逆范式化(允许数据冗余)
- 多分区存储
- 动态水平扩展
- 多副本异步复制
- 软事务(最终一致性)
MongoDB特有的特点
- 类JSON数据格式(BSON)
- 多级索引
- 面向文档,模式自由
- 高可用的复制集
- 水平扩展
- 跨平台,多种语言接口
- 弱事务性(具有原子性,原子操作是针对一个文件的)
- 大数据量、高并发、弱事务性的web2.0互联网应用
安装环境
简单的mongodb使用
- 启动
mongod --port 27017 --dbpath ./data --logpath ./log/mongod.log -logappend
- 常见操作
- mongo
mongo
- db
db #查看当前哪个数据库
- use yourdb
use db_name #由于数据库是虚拟的 #所以use的时候不管db是不是存在,只有在有数据的时候才会创建
- show dbs
show dbs #查看当前实例中有哪些数据库
- show collections
show collections #查看数据库中有哪些集合
- CRUD
db.collection_name.insert({one:'1',two:'2'}) #一个集合中的数据的结构是可以不一样的 db.collection_name.find({这里加要找的参数}) #返回的是找到的集合内有什么。 db.collection_name.remove({查找条件}) db.collection_name.update({查找到的条件},{更改或插入的参数}) #这样子写的是,全部用后面的更改参数覆盖 db.collection_name.update({查找条件},{$set : {这种不是覆盖修改}}) db.collection_name.drop() #删除所有的元素
pymongo的学习
- 创建链接,定位到集合
from pymongo import MongoClient conn = MongoClient('localhost') db = conn.beifeng students = db.test.students
- 插入操作
students.remove(None) #清空集合 deamov = { 'name':'Test', 'value':'value' } students.insert_one(deamov).inserted_id #插入操作,注意可以通过返回值查看id userinfo = getFakeData() #获取假数据略 students.insert_many(userinfo, ordered = False).insterted_ids #批量插入,ordered是是否按顺序插入
- 查询操作
find(filter) #返回值类似游标 cursor = students.find({}) cursor = students.find({'name':'DeamoV'}) cursor = students.find({'name':{'$in':['DeamoV','Vincent']}}) #名字是DeamoV或者是Vincent cursor = students.find({'age':{'$gt':25}}) #年龄大于25 cursor = students.find({ 'name':{'$in':['DeamoV','Vincent']}} , 'age':{'$gt':25} }) #and操作 cursor = students.find({'$or':[ { 'name':{'$in':['DeamoV','Vincent']}} , 'age':{'$gt':25} } ]}) #or操作 cursor = students.find({'habit.habit2':'eat'}) #如果属性是嵌套的,这个是访问嵌套的子属性的 import json from bson import json_util json.dumps(student,indent = 4,default=json_util.default) #导出为json格式
- 更新操作
update_one(filter, update, upsert=True/False) update_many()filter, update, upset=True/False) replace_one(filter,replacement,upsert=False) #filter和之前的find一样,update是怎么更新 #upsert就是没有的时候是否插入 #example students.update_many( {}, {'$inc': {'age':2} } ) #这个是对所有的age字段+2 #$min是对选的数字和原有字符相比选最小的 students.update_many( {'name': {'$in':['VDeamoV','bajie']} }, {'$currentDate': {'create_time':True, 'mod_time':{'$type':'timestamp'} } } ) #currentDate
- 删除操作。
find_one_and_replace( filter, update, projection=None, sort=None, return_document=ReturnDocument.BEFORE, **kwargs ) #这三个函数的返回值是记录本身,而不是数据,sort是在搜到多个的时候选哪个 find_one_and_delete find_one_and_update record students.find_one_and_replace( {}, {'$set':{'locked':1}, '$inc':{'age':2} }, projection={'age':True,'name':True}, sort=[('age',pymongo.DESCENDING)], return_document = mymonggo.ReturnDocument.BEFORE, **kwargs ) #projection是对哪个记录进行返回,之前的是返回的状态 #sort是按照age的值进行降序排序 #returnDocument是设置是修改前的状态,还是修改后的状态
- 聚合操作
通过类似管道的方法进行操作数据库。cursor = students.aggregate([ {'$sort':{'city':1,'state':1}}, {'$project':{ '_id':0 'state':1 'city':1 'pop':1 } ]) #这里我们定义了两个操作,按照city和state进行排序 #之后project是映射操作,0是不要的参数,1是要的 cursor = students.aggregate([ {'$group':{'_id':'$state', 'totalPop':{'sum':'$pop'} } }, {'$match':{'totalPop':{'$gte':10*1000*1000}} } ]) #这里的_id不是之前意义的id,这里的id指的是按照state进行分组 #然后把pop的进行求和存到totalPop这个字段中 #第二步操作是,选出totalPop>=10*1000*1000的记录 cursor = students.aggregate([ {'$group':{'_id':{'state':'$state','city':'$city'}, 'pop':{'sum':'$pop'} } }, {'$group':{'_id':'$_id.state', 'avgCityPop':{'avg':'$pop'} } }, {'sort':{'avgCityPop':1} } ]) #第一步是按照state和city进行分组,并且统计人数 #第二步是把第一步结果按照state来进行分组,并统计平均值 #第三步是按照平均城市人口进行排序,1是从小到达,-1是从大到小 for i in cursor: print(i)
网友评论