Mongodb学习笔记 - 4

目录


统计操作符
聚合操作
聚合管道
文件存储
GridFS文件存储方案
游标 游标对象属性函数
索引操作


统计操作符

  • $sum 求和
    参数:
        1 $sum:1 同count表示计数
        2 $sum:"$域名" 统计某一个域名的和
  • $avg 求平局值
    参数:
        $avg:"$域名"
  • $max 求最大值
  • $min 求最小值

聚合操作

    说明:对文档的信息进行整理统计的操作
    返回:统计后的文档集合
    格式:
        db.collection.aggregate([{},{}.....])
        说明:完成聚合操作
        参数:聚合条件,配合聚合操作符使用

  • $group 分组聚合
    使用:配合具体的统计操作符
    示例:求男女生人数
        db.getCollection('NewClass').aggregate([{$group:{_id:"$sex",count:{$sum:1}}}])
    示例2:求男女生年龄的和
        db.getCollection('NewClass').aggregate([{$group:{_id:"$sex",sum:{$sum:"$age"}}}])
    示例3:求男女平均年龄
        db.getCollection('NewClass').aggregate([{$group:{_id:"$sex",avg:{$avg:"$age"}}}])
    示例4:求男生女生年龄最大值
        db.getCollection('NewClass').aggregate([{$group:{_id:"$sex",max:{$max:"$age"}}}])
  • $project 修改文档的显示效果
    整体功能:修饰显示结果,功能同find的第二个参数
    示例1:只查看姓名和年龄
        db.class.aggregate([{$project:{_id:0,name:1,age:1}}])
    示例2:可以给域起别名
        db.class.aggregate([$project:{_id:0,"名字":"$name","年龄":'$age'}])
  • $match 过滤想要的数据
    作用:过滤数据
    参数:参数同find的query用法
    示例:得到年龄大于30的所有文档
        db.class.aggregate([{$match:{age:{$gt:30}}}])
  • $limit 显示前几个文档
  • $skip 跳过前几个文档显示
    示例:跳过两个,显示两个
        db.class.aggregate([{$skip:2},{$limit:2}])
  • $sort 排序
    示例:按照年龄排序
        db.class.aggregate([{$sort:{age:1}}])

聚合管道

将前一个聚合操作产生的结果,交给后一个聚合操作继续使用
基本格式:
    db.collection.aggregate([聚合1,聚合2.......])
示例:
    获取男性用户,按照年龄排序,并不显示id
    db.class.aggregate([{$match:{age:"male"}},{$sort:{age:1}},{$project:{_id:0}}])
聚合联系
使用grade数据库 给更多同学添加内部文档score:{english:87,chinese:87,math:45}
1按照性别统计每组人数
    db.NewClass.aggregate([{$group:{_id:"$sex",count:{$sum:1}}}])
2统计该班中有哪个同学姓名为重名同学
    db.NewClass.aggregate([{$group:{_id:"$name",count:{$sum:1}}},{$match:{count:{$gt:1}}}])
3统计所有男生的语文成绩,只打印姓名,性别,语文成绩即可
    db.NewClass.aggregate([{$match:{sex:"m",sex:"Male"}},{$project:{_id:0,name:1,sex:1,'score.chinese':1}}])
4将所有女生按照英语成绩将序排序
    db.NewClass.aggregate([{$match:{sex:"Female"}},{$sort:{"score.english":-1}}])

文件存储

1存储路径
    将文件放在本地路径(网络地址)中,然后数据库中存储该文件的查找路径
    优点:节省空间
    缺点:当数据库或者文件位置发生变化时,文件丢失
2将文件转换为二进制,存储文件本身
    优点:数据库与文件绑定,数据库在文件在
    缺点:占用数据库空间大,存取效率低

综上:
    如果是小文件,建议转换2机制存入
    如果是大文件建议使用GridFS方案存储
    大文件:大于16M的文件

GridFS文件存储方案

解释:
    1 在mongodb中使用两个集合配合存储文件
    2 fs.files用来存储文件的相关信息,为每一个文件创建一个文档,存储文件名,文件大小,存入时间等。。
    3 fs.chucks 用来分块存储文件的实际内容(需要将实际内容转换为Binary Data类型)
    
存储大文件:
    mongofiles -d [dbname] put [filepath]
    说明:如果数据库不存在,创建数据库
         数据库会自动创建fs.files 和 fs.chunks两个集合
  • 两个集合的关联
    同一个文件fs.files中的_id等于fs.chunks中的files_id域的值
  • 提取方法
    mongofiles -d [dbname] get [filename]
  • GridFS方案优缺点
    优点
        存储方便,提供较好的命令支持和编程借口
    缺点
        存取效率低

游标

    MongoShell中支持js代码,可以通过js获取游标,进而获取数据操作结果
    示例:
        var cursor = db.class.find()
        cursor.next() 获取下一个数据
        cursor.hasNext()#如果游标没到数据末尾,则返回True

使用python操作数据库

  • 导入
    import pymongo

操作步骤:

    1 连接数据库,生成连接对象
        conn.pymongo.MongoClient("localhost",27017)
    2 选择要操作的数据库 生成数据库对象
        db = conn.库名
        db = conn.["库名"]
    3 获取集合对象
        myset = db.集合名
        myset = db.["集合名"]
    4 增删该查
    5 关闭对象
        conn.close

pyhton操作

  • 插入操作
    insert:插入数据,同mongoshell
    insert_many:插入多条
    insert_one:插入一条
    save() 插入数据,通过_id可以修改
    # myset.insert({"name":"张铁林","king":"乾隆"})
    # myset.insert([{"name":"张国立","king":"康熙"},{"name":"程道明","king":"康熙"}])
    # myset.insert_many([{"name":"唐国强","king":"雍正"},{"name":"陈建斌","king":"雍正"}])
    # myset.insert_one({"name":"郑少秋","king":"乾隆"})
    # myset.save({"_id":1,"name":"聂远","king":"乾隆"})
  • 查找操作
    find()
        功能:对数据库进行查找
        参数:同mongoshell
        返回值:返回游标对象
    find_one()
        使用:同shell中的findOne()
        返回值:一个字典 
    # cursor = myset.find({"age":{"$gt":30}},{"_id":0})
    # for i in cursor:
    #     print(i)
  • 修改操作
    update(query,update,upsert=False,multi=False)
    update_many(query,update,upsert=False)
    update_one(query,update,upsert=False)
    # myset.update({"name":"张国立"},{"$set":{"king_name":"玄烨"}})
    # myset.update({"name":"霍建华"},{"$set":{"king":"乾隆"}},upsert=True)
    # myset.update({"king":"乾隆"},{"$set":{"king_name":"宏利"}},multi=True)
  • 删除操作remove
    格式
        remove(query,multi=True)
    注意;注意和shell中的区别:remove(query,justOne:False)
    示例:
        myset.remove({"king":"康熙"},multi:False)

游标对象属性函数

limit(n)返回的也是个游标对象
skip(n)返回的也是个游标对象
count()
sort()
    示例:使用age将序排序
       cursor.sort([(age,-1)])
    next()
    
next()
    注:如果游标使用了next()操作,再使用limit,skip,sort会报错

索引操作

  • 创建索引
    ensure_index()
    示例 给name属性创建索引
        myset.ensure_index("name")
    返回值:索引名称
    创建逆向索引
        myset.ensure_index([("name",-1)])
    创建复合索引
        myset.ensure_index([("name",-1),("age",1)])
    创建索引的终极语法
        myset.ensure_index("fieldname",name="indexname",unique=True,sparse=True)
  • 查看索引
    list_indexes()
  • 删除索引
    drop_index()
    按名字删除索引
        myset.drop_index("name_1") #删除name_1为名字的索引
  • 删除所有索引
    drop_indexes()

Python Mongo聚合

    aggregate([])
    参数和shell一样
    返回值和find一样,也是一个游标对象

通过pymongo进行文件存取工作

    1导入:
        import gridfs
    2连接数据库 获取相应的数据库对象
    3通过gridfs.GridFS(db)获取集合对象(代表存储文件的两个集合)
    4通过find()查找文件返回游标
    5通过循环便利游标获取这顶文件对象,read()读取文件内容写入本地

以二进制的方式读写文件

    将文件读取的二进制格式转换为mongodb能够识别的二进制格式
        data = binary.Binary(f.read())
        然后插入data到数据库就行
    1 import bson.binary
    2 具体使用看binaryCunQu.py
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值