美文网首页
Python和MongoDB数据库

Python和MongoDB数据库

作者: DeamoV | 来源:发表于2018-07-23 11:16 被阅读66次

    什么是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. 常见操作
    • 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的学习

    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)
      

    相关文章

      网友评论

          本文标题:Python和MongoDB数据库

          本文链接:https://www.haomeiwen.com/subject/ydidmftx.html