Mongdb与pymongo

# MongoDB特点:
    - 易扩展
    - 大数据量,高性能
    - 灵活的数据配置

    - 缺点:容易产生重复数据

# MongoDB 三要素:
    - 数据库 -> mysql 数据库
    - 集合 -> mysql 数据表
    - 文档 -> mysql 记录

# MongoDB 数据库操作指令:
    - 查看当前所在数据库: db
    - 查看数据库:show dbs
    - 切换数据库:use 数据库名
    - 删除数据库 db.dropDatabase()

# MongoDB 操作集合
    - 当我们下一个集合中添加数据的时候,系统会自动创建该集合
    - 查看所有集合:show collections
    - 删除集合: db.集合名.drop()

# 增删改查:
    - 插入数据
        - db.stu.insert({name: “laowang”, age: 1})
        - db.stu.insert({_id:1, name:”范冰冰”, age:19})
        - db.stu.save({name:”迪丽热巴”, age:16})
        - 如果没有指定_id会自动生成

    - 更改数据
        - db.stu.save({_id:2, name:”古力娜扎”, age:26})
        - db.stu.update({name:’laowang’, {age:12}}) 
        - db.stu.update({_id:2}, {$set:{age:36}})  ==> 保留原数据
        - update默认修改一条数据,需要插入{multi:true}
        - db.stu.update({age:36}, {$set: {age:24}}, {multi:true})
    
    - 删除数据
        - db.stu.remove({age:36})
        - 默认删除所有数据,只删除一条数据需要添加{justOne:true}
        - db.stu.remove({age:23}, {justOne:true})
 
    - 查询数据
        - db.find() 或者 db.find().pretty()
        - db.findOne()

        - 比较运算符:$lt, $lte, $gt, $gte, $ne
            - db.stu.find({age: {$lte:18}})

        - 逻辑运算符
            - and: 在json中写多个条件即可
                - db.stu.find({age: {$gte:18}, gender:true})

            - or: 以数组的方式添加条件, $or
                - db.stu.find({$or: [{age:{$gte:18}}, {gender:false}]})
            
            - 混合查询,查询年龄大于18或者女性的大理人
                - db.stu.find({$or:[{age:{$gte:18}}, {gender:false}], hometown:’大理'})

        - 范围运算符:$in, $nin
            - db.stu.find({age: {$in: [16, 45]}})
            - db.stu.find({age: {$nin: [16, 45]}})

        - 正则表达式:
            - db.stu.find({name: /^黄/})
            - db.stu.find({name: {$regex:’^黄'}})

        - 分页
            - db.stu.find().skip(2).limit(2)  ==> 第二页,每页2条

        - 使用函数自定义查询
            - db.stu.find({$where:function(){return this.age > 30;}})
        
        - 投影(选择显示的字段)
            - db.stu.find({}, {name:1, age:1, _id:0})  # _id默认显示
        
        - 排序(1为升序,-1为降序)
            - db.stu.find().sort({gender:-1, age:1})

        - 记数
            - db.stu.find({gender:true}).count()
            - db.stu.count({gender:true})

        - 选取某个字段,根据查询条件查询,并且去重
            - db.stu.find(‘hometown’, {age:{$gte:20}}) ==> [ "蒙古", "桃花岛", "大理" ]
        

# 管道与集合
    - db.stu.aggregate({$group:{_id:’$上一分组字段’, 统计字段名:{统计函数}}})

        - # 以gender为id字段,统计总数 ==> {$sum: 倍数}
          db.stu.aggregate(
              {$group:{_id:’$gender’, count:{$sum:1}}}
          ) 

        - # 统计总人数和平均年龄 ==> {$avg: ‘$字段名’}, _id:null 返回整个数据
          db.stu.aggregate(
              {$group: {_id:null, totol:{$sum:1}, avg_age:{$avg:'$age'}}}
          )

        - # 查询男女的姓名,组成数组 ==> {$push: ‘$字段名'}
          db.stu.aggregate(
              {$group:{_id: ‘$gender’, names:{$push: ‘$name'}}}
          )

          # 返回原数据(了解) ==> {$push: $$ROOT}
          db.stu.aggregate(
              {$group:{_id: ‘$gender’, names:{$push: ‘$$ROOT'}}}
          )

        - # 统计每个country/province下的userid数量(数据有重复)
          db.t2.aggregate(
              {$group:{_id: {country:’$country',province:'$province', userid:'$userid'}}},
              {$group:{_id:{country:'$_id.country', province:'$_id.province'}, count: {$sum:1}}}
          )    

    - {$match: {age:{$gt:20}}} ==> 过滤字段
        - 查询年龄大于20的男女生人数
            db.stu.aggregate(
                {$match: {age: {$gt:20}}},
                {$group:{_id: '$gender', count:{$sum:1}}}
            )

    - $project ==> 设置显示字段,修改文档结构
        - 查询男女,只输出名字和年龄
            db.stu.aggregate(
                {$project: {_id:0, name:1, age:1}}
            )

        - 查询男女,显示性别和数量(gender, count)
            db.stu.aggregate(
                {$group:{_id:'$gender', count:{$sum:1}}},
                {$project:{_id:0, gender:'$_id', count:'$count'}}
            )
    
    - {$sort: {字段名:1/-1}} ==> 管道排序
        - 查询男女人数,并且结果排序
        db.stu.aggregate(
            {$group: {_id: '$gender', count:{$sum:1}}},
            {$sort: {count:1}},
            {$project: {_id:0, gender:'$_id', count:'$count'}}
        )
  
    - $skip, $limit
        - 查询男女人数,升序,只选取第二条数据
        db.stu.aggregate(
            {$group: {_id:'$gender', count:{$sum:1}}},
            {$sort: {count:1}},
            {$skip:1},
            {$limit:1}
        )

    - $unwind ==> 拆分数组
        - 插入数据以后,将列表拆分显示
            db.t3.insert({_id:1,item:'t-shirt',size:['S','M','L']})       
            db.t3.aggregate(
                {$unwind: '$size’}
            )

        - 计算列表长度
            db.t4.insert({"username":"Alex","tags": ['C#','Java','C++']})

            db.t4.aggregate(
                {$unwind: '$tags'},
                {$group: {_id: '$username', count: {$sum:1}}}
            )
        
        - 拆分的同时,也显示null或者空字段
            db.t5.aggregate(
                {$unwind: {path: '$size', preserveNullAndEmptyArrays: true}}
            )
 

# 循环插入语句:
  for(i=0;i<100000;i++){
      db.t255.insert({name:'test'+i,age:i});
  }

# 创建索引
    - db.t255.ensureIndex({name:1})

    - db.t255.dropIndex({name:1})

    - 唯一索引:
        - 建立后字段不能重复insert({name: ’test1'})出错
        - db.t255.ensureIndex({name:1}, {unique:true}) 

    - 联合索引:
        - 如果没有查询到第一个索引的话,索引不会生效
        - db.t255.ensureIndex({name:1, age:1})

    - 查看索引: 
        - db.t255.getIndexes()

    
# 备份与恢复数据库
    - 备份数据库
        - mongodump -h 127.0.0.1 -p 27017 -d test -o ~/Desktop

        - 本地可以不指定ip和端口
        - mongodump -d test -o .

    - 恢复数据库
        - mongorestore -h 127.0.0.1:27017 -d mytest --dir ./test
        

        
# pymongo: MongoDB与python交互

from pymongo import MongoClient

class MongoTest(object):
    def __init__(self):
        # 建立MongoDB客户端连接
        client = MongoClient(host='127.0.0.1',
                             port=27017)
        print(client)
        # 通过客户端对象获取要操作的集合对象
        self.collection = client['test']['t']

    # 方法开头不能写test
    def try_insert_one(self):
        """插入一条文档"""
        self.collection.insert_one({'name': '赵丽颖', 'age': 22})

    def try_insert_many(self):
        """插入多条数据"""
        # documents格式:[{}, {}]
        documents = [{'name': 'test_{}'.format(i), 'age': i} for i in range(1, 100)]
        self.collection.insert_many(documents)

    def try_update_one(self):
        """修改一条文档"""
        # 错误写法
        # self.collection.update_one({'name': '赵丽颖'}, {'name': '迪丽热巴'})
        self.collection.update_one({'name': '赵丽颖'}, {'$set': {'name': '迪丽热巴'}})

    def try_update_many(self):
        """修改满足条件的所有数据"""
        # 把年龄为22的名字都改为 范冰冰
        self.collection.update_many({'age': 22}, {'$set': {'name': '周冬雨'}})

    def try_find_one(self):
        """查询一条文档"""
        result_dict = self.collection.find_one({'age': 22})
        print(result_dict)
        print(type(result_dict))

    def try_find_many(self):
        """查询多条数据"""
        cursor = self.collection.find({'age': 22})
        print(cursor)
        # <class 'pymongo.cursor.Cursor'>
        print(type(cursor))
        # 即生成器,返回字典
        for item in cursor:
            print(item)

    def try_del_one(self):
        """删除一条文档"""
        self.collection.delete_one({'age': 22})

    def try_del_many(self):
        """删除多条数据"""
        # 删除所有年龄为22
        # self.collection.delete_many({'age':22})

        # 删除所有名字包含test
        self.collection.delete_many({'name': {'$regex': 'test'}})


if __name__ == '__main__':
    mongo_test = MongoTest()
    # mongo_test.try_insert_one()
    # mongo_test.try_insert_many()
    # mongo_test.try_update_one()
    # mongo_test.try_update_many()
    # mongo_test.try_find_one()
    # mongo_test.try_find_many()
    # mongo_test.try_del_one()
    mongo_test.try_del_many()

 
 
 
 
 
 
import time
from pymongo import MongoClient

"""
    id:0, 1, ... 999
    name: py0, ... py999
    
    查询id为100倍数的数据
"""
class PymongoTest(object):
    def __init__(self):
        # create client obj
        client = MongoClient()
        # get collection obj
        self.collection = client['test']['t3']

    def try_insert_data(self):
        documents = [{'_id': i, 'name': 'py{}'.format(i)} for i in range(1,1000)]
        self.collection.insert_many(documents)

    def try_find_data(self):
        # 1. 自定义查询
        # cursor = self.collection.find({"$where": 'function(){ return this._id % 100 == 0 && this._id != 0}'})
        # for data in cursor:
        #     print(data)

        # 2. 查询所有数据(速度更快)
        cursor = self.collection.find()
        for data in cursor:
            if data['_id'] % 100 == 0 and data['_id'] != 0:
                print(data)

if __name__ == '__main__':
    pt = PymongoTest()
    # pt.try_insert_data()
    # float, 单位秒
    start = time.time()
    pt.try_find_data()
    end = time.time()
    print('cost:', end - start)
            
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值