Python和MongoDB数据库

2018-07-23  本文已影响66人  DeamoV

什么是NoSQL

在Web2.0时代,简单的关系型数据库固有的缺陷无法处理大数据,于是出现了新型的数据库,这些数据库不使用SQL接口操作数据库,所以称为NoSQL数据库

NoSQL数据库分类

  1. Key-value:memcache, redis
  2. 文档型:Mongodb
  3. 列式:hbase
  4. 图:neo4j

CAP理论

场景,即讨论背景为分布式系统

  1. Consistency:所有节点上的数据时刻保持同步
  2. Availability:每个请求都能接受到一个响应,无论成功还是失败
  3. Partition Tolerance:系统应该能持续提供服务
    CAP理论说的是在一个分布式系统下,不存在任何分布式算法能满足三条

NoSQL特点

  1. 模式自由
  2. 逆范式化(允许数据冗余)
  3. 多分区存储
  4. 动态水平扩展
  5. 多副本异步复制
  6. 软事务(最终一致性)

MongoDB特有的特点

  1. 类JSON数据格式(BSON)
  2. 多级索引
  3. 面向文档,模式自由
  4. 高可用的复制集
  5. 水平扩展
  6. 跨平台,多种语言接口
  7. 弱事务性(具有原子性,原子操作是针对一个文件的)
  8. 大数据量、高并发、弱事务性的web2.0互联网应用

安装环境

  1. Mongodb
    brew install mongodb
    
  2. Mongovue& Robo3T(Mongovue是可视化用的)
  3. Pymongo
    pip3 install pymongo
    

简单的mongodb使用

  1. 启动
    mongod --port 27017 --dbpath ./data --logpath ./log/mongod.log -logappend
    
  2. 常见操作

pymongo的学习

  1. 创建链接,定位到集合
    from pymongo import MongoClient
    
    conn = MongoClient('localhost')
    db = conn.beifeng
    students = db.test.students
    
  2. 插入操作
    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是是否按顺序插入
    
  3. 查询操作
    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格式
    
  4. 更新操作
    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
    
  5. 删除操作。
    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是设置是修改前的状态,还是修改后的状态
    
  6. 聚合操作
    通过类似管道的方法进行操作数据库。
    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)
    
上一篇 下一篇

猜你喜欢

热点阅读