断网了2天  今天补上
 
 
聚合操作:
对文档的信息进行整理统计的操作
返回:统计后的文档集合
db.collection.aggregate()
功能:聚合函数,完成聚合操作
参数:聚合条件,配合聚合操作符使用
返回:聚合后的结果
 
常用聚合操作符:
1.$group  分组聚合   要配合具体的统计操作符获取结果
 
$sum  求和
db.class1.aggregate({$group:{_id:'$gender',num:{$sum:1}}})
     分组   按照gender值统计 统计结果,求和每有一个加1
统计所有男生和女生的年龄之和
db.class1.aggregate({$group:{_id:'$gender',num:{$sum:'$age'}}})
 
$avg  平均值
求男生 女生年龄的平均数
 db.class1.aggregate({$group:{_id:'$gender',num:{$avg:'$age'}}})
 
$max 求最大值
求男生女生的年龄最大值
db.class1.aggregate({$group:{_id:'$gender',num:{$max:'$age'}}})
 
$min  求最小值
求男生女生的年龄最小值
db.class1.aggregate({$group:{_id:'$gender',num:{$min:'$age'}}})
 
2.$project
用于修改文档的显示效果
 
$project值的用法同find()的field参数相同
db.class1.aggregate({$project:{_id:0,name:1,age:1}})
 
自定义显示的域名
db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
 
 
3.$match
过滤想要的数据
 
过滤年龄大于30的数据,$match值的写法同query
 db.class1.aggregate({$match:{age:{$gt:30}}})
 
4.$limit
显示前几个文档
db.class1.aggregate({$limit:3})
 
5.$skip
跳过前几个文档显示
 db.class1.aggregate({$skip:2})
 
6.$sort   排序
 
按照年龄排序
db.class1.aggregate({$sort:{age:1}})
 
聚合管道
将前一个聚合操作产生的结果,交给后一个聚合操作继续使用
db.collection.aggregate([{聚合1},{聚合2},{}...])
 
$match --> $sort -->$project
 db.class1.aggregate([{$match:{gender:'m'}},{$sort:{age:1}},{$project:{_id:0}}])
 
聚合示例
使用grade数据库
给更多同学添加 域score
score:{english:87,chinese:76,math:91}
 
1. 按照性别统计每组人数
aggregate({$group:{_id:'$sex',num:{$sum:1}}})
 
2. 统计该班中有哪个同学姓名为重名同学
aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
 
3. 统计所有男生的语文成绩,只打印姓名,性别,语文成绩即可
aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,sex:1,'score.chinese':1}}])
 
4. 将所有女生按照英语成绩降序排序
aggregate([{$match:{sex:'w'}},{$sort:{'score.english':-1}}])
 
文件存储:
 
1.存储路径
将文件放在本地路径(网络路径)下,然后数据库中存储该文件的查找路径
  
优点 : 节省数据库空间
缺点 : 当数据或者文件位置发生变化时文件即丢失
 
2. 将文件转换为二进制,存储文件本身
 
数据库支持二进制数据格式
将文件转换为二进制格式,然后存入数据库中
 
优点 : 数据库和文件绑定,数据库在文件即在
缺点 : 占用数据库空间大,存取效率低
 
mongodb存储文件本身
* 如果是小文件建议转换二进制直接插入
* 如果是大文件建议使用GridFS方案存储(大于16M)
 
GridFS方案解释
 
1. 在mongodb一个数据库中使用两个集合配合存储文件
2. fs.files 用来存储文件的相关信息,为每一个文件创建一个文档,
   存储文件名,文件大小,存入时间。。。
3. fs.chunks 用来分块存储文件的实际内容(Binary data 类型数据)
 
存储方法:
mongofiles  -d dbname(数据库)   put  file(要存储的文件)
                                         
 
* 数据库不存在会自动创建数据库
  数据库中会自动创建fs.files  fs.chunks两个集合
 
fs.files文档结构:
{
"_id" : ObjectId("5b7cdcd769d72e12b4f166d0"),
"chunkSize" : 261120,
"uploadDate" : ISODate("2018-08-22T03:47:35.381Z"),
"length" : 305033,
"md5" : "3698b5e762b5b396766aaf9feef7e10d", 
"filename" : "file.jpg"
}
 
fs.chunks文档结构
{
"_id" : ObjectId("5b7cdcd769d72e12b4f166d2"),
"files_id" : ObjectId("5b7cdcd769d72e12b4f166d0"), 
"n" : 1, 
"data" : BinData(0,"tQWR0AR......AG") 
}
 
* 同一个文件fs.files中的_id值等于fs.chunks中的    files_id域的值
 
提取方法:
 
mongofiles  -d  dbname   get  file
 
GridFS方案:
优点 : 存储方便,提供较好的命令支持和编程接口
缺点 :  存取效率低下 还没有复制的快
 
mongo shell中获取游标:
* mongo shell下支持JS代码,可以通过JS获取游标,进而获取数据操作结果。
 
var cursor = db.class1.find()
cursor.next()   获取下一条结果
cursor.hasNext()  查看是否有下一个对象
 
 
通过python操作 MongoDB:
pymongo 模块   第三方模块
安装:
sudo  pip3 install  pymongo
 
操作步骤:
 
    1. 连接数据库,生成数据库连接对象
        conn = pymongo.MongoClient('localhost',27017)
 
    2. 选择要操作的数据库,生成数据库对象 (__setitem__)
        db = conn.stu
        db = conn['stu']
 
    3. 获取集合对象
        myset = db.class0
        myset = db['class0']
 
    4. 通过集合对象调用mongodb数据库操作函数
        增删改查,聚合,索引。。。。。
 
    5. 关闭数据库连接
           conn.close()
 
 
插入文档:
 
insert()    插入数据 功能同 mongoshell
insert_many()   插入多条
insert_one()  插入一条
save()   插入数据,通过_id可以修改
 
 
查找操作:
find()
功能 : 对数据库进行查找
参数 : 同mongoshell  find()
返回值 : 返回游标对象
                cursor = myset.find({},{'_id':0})
cursor的属性函数
next()
limit()
skip()
count()
sort()
 
Python中sort和MongoDB的区别
                并且Python中的数据是字典和MongoDB的数据不同 
                所以键和操作符号都必须要加引号
pymongo  : sort([('age',-1),('name',1)])
mongoshell : sort({age:-1,name:1})
 
* 如果通过for或者next操作了游标对象,再调用limit,skip,sort会报错
 
find_one()
用法同mongoshell中 findOne()
返回一个字典
 
 
修改操作:
update(query,update,upsert = False,multi = False)
update_many()
update_one()
 
删除操作:
remove(query,multi = True)
功能: 删除文档
参数: query 筛选条件
       multi  默认True表示删除所有符合条件的
              False只删除一条
 
索引操作:
ensure_index()   创建索引
list_indexes()   查看索引
drop_index()   删除一个索引
drop_indexes()  删除所有索引
 
聚合操作:
aggregate([])
参数和mongoshell一样
返回值和find()函数一样也是得到一个游标对象
 
 
pymongo进行文件存取操作:
 
GridFS 文件提取:
 
import  gridfs
1. 连接数据库,获取相应的数据库对象
2. 通过 gridfs.GridFS(db) 获取集合对象(代表存储文件的两个集合)
3. 通过find()查找文件返回游标
4. 通过循环遍历游标获取指定文件对象,read()读取文件内容写入本地
 
以二进制的方式存取文件
import bson.binary
 
 
增删改查操作:
 

from pymongo import MongoClient 

#创建连接
conn = MongoClient('localhost',27017) #创建数据库对象
db = conn.stu #创建集合对象
myset = db.class4 print(dir(myset)) # 插入操作
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':'乾隆'}) # 查找操作 cursor = myset.find({},{'_id':0}) # i为每个文档对应的字典
for i in cursor:
print(i['name'],'--->',i['King']) myset = db.class1
# 操作符使用引号变为字符串
cursor = myset.find({'age':{'$gt':30}},{'_id':0}) cursor.limit(2)#获取前两个文档
cursor.skip(2) #跳过前两个
cursor.sort([('age',-1),('name',1)]) #对游标内容排序 for i in cursor:
print(i)
print(cursor.next()) #获取下一个文档 dic = {'$or':[{'age':{'$gt':35}},{'gender':'w'}]}
data = myset.find_one(dic,{'_id':0})
print(data) # 修改操作
myset.update({'name':'张国立'},\
{'$set':{'king_name':'玄烨'}}) myset.update({'name':'霍建华'},{'$set':{'King':'乾隆'}},\
upsert = True) myset.update({'King':'乾隆'},\
{'$set':{'king_name':'弘历'}},multi = True) myset.update_one({'King':'康熙'},\
{'$set':{'king_name':'爱新觉罗玄烨'}}) myset.update_many({'King':'雍正'},\
{'$set':{'king_name':'胤禛'}}) # 删除操作 myset.remove({'King':'康熙'})
myset.remove({'King':'乾隆'},multi = False) #查找并删除
print(myset.find_one_and_delete({'King':'乾隆'})) #关闭连接
conn.close()
索引操作:
 

from pymongo import MongoClient 

#创建连接
conn = MongoClient('localhost',27017) #创建数据库对象
db = conn['stu'] myset = db['class1'] # 删除所有索引
myset.drop_indexes() # 创建索引
index = myset.ensure_index('name')
# 创建复合索引
index = myset.ensure_index([('name',-1),('age',1)])
print(index) # 删除一个索引
myset.drop_index('name_1') # 创建特殊索引
index = myset.ensure_index('name',name = "myIndex",\
unique = True,sparse = True) # 查看集合中的索引
for i in myset.list_indexes():
print(i) myset = db.class4 l = [
{'$group':{'_id':'$King','num':{'$sum':1}}},
{'$match':{'num':{'$gt':1}}}
] cursor = myset.aggregate(l)
for i in cursor:
print(i) conn.close()
 
文件的存取:

from pymongo import MongoClient
import bson.binary conn = MongoClient('localhost',27017)
db = conn.images
myset = db.img #存储
f = open('file.jpg','rb') #转换为mongodb的二进制数据存储形式
content = bson.binary.Binary(f.read()) #插入到数据库
myset.insert({'filename':'file.jpg','data':content}) #提取 data = myset.find_one({'filename':'file.jpg'}) #通过字典获取到数据库内容写入本地
with open(data['filename'],'wb') as f:
f.write(data['data']) conn.close()
 
 
手动存入文件MongoDB默认创建的文件数据导出:
 

from pymongo import MongoClient
#pymongo绑定的模块
import gridfs conn = MongoClient('localhost',27017)
db = conn.grid #获取gridfs对象
#fs综合了fs.files fs.chunks两个集合的属性内容
fs = gridfs.GridFS(db) #查文档生产游标
files = fs.find() #获取每一个文件的对象
for file in files:
print(file.filename)
if file.filename == 'file.jpg':
with open(file.filename,'wb') as f:
#从数据库读取出来
data = file.read()
#写入本地
f.write(data) conn.close()

Python全栈 MongoDB 数据库(聚合、二进制、GridFS、pymongo模块)的更多相关文章

  1. Python全栈 MongoDB 数据库(概念、安装、创建数据)

    什么是关系型数据库?           是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,             同时也是一个被组织成一组拥有正式描述性的表格( ...

  2. Python全栈 MongoDB 数据库(数据的修改)

    修改操作符的使用   $set 修改一个域的值,增加一个域   阿哲年龄修改为33 db.class1.update({name:'阿哲'},{$set:{age:33}})   如果sex域不存在则 ...

  3. Python全栈 MongoDB 数据库(Mongo、 正则基础、一篇通)

                  终端命令:       在线安装:         sudo apt-get install mongodb         默认安装路径 :  /var/lib/mong ...

  4. Python全栈 MongoDB 数据库(数据的查找)

      非关系型数据库和关系型数据库的区别? 不是以关系模型构建的,结构自由 非关系型数据库不保证数据一致性 非关系型数据库可以在处理高并发和海量数据时弥补关系数据库的不足 非关系型数据库在技术上没有关系 ...

  5. python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)

    一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...

  6. python全栈开发从入门到放弃之模块和包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  7. Python全栈 MySQL 数据库(SQL命令大全、MySQL 、Python调用)

    为了梦想与了信仰    开局一张图   主要三个方面: 1.Linux终端命令 2.MySQL语句 3.Python调用   先删库 再跑路.....                         ...

  8. Python全栈 MySQL 数据库 (引擎、事物、pymysql模块、orm)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图     存储引擎(处理表的处理器)     基本操作:         ...

  9. Python全栈 MySQL 数据库 (简述 、安装、基本命令)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图     一个月的python已经结束了  下面就是数据库了   先说M ...

随机推荐

  1. python+appuim 处理系统权限弹窗

    from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.w ...

  2. 七、IntelliJ IDEA 常见文件类型的图标介绍

    咱们已经了解了很多关于 IntelliJ IDEA 的内容啦,例如,在 Windows 系统下安装 IntelliJ IDEA.运行 IntelliJ IDEA .创建 Java 项目以及修改 Int ...

  3. js 3秒后跳转页面的实现代码

    隔多少秒后自动跳转到其它页(js脚本) 方法一: $(function(){ Load(URL); }) var secs = 3; //倒计时的秒数 var URL = "<?= u ...

  4. 关于object类的两个重要方法以及为什么重写equals一定要重写hashcode()

    toString()----------------------输出对象的地址 重写后输出对象的值对象.equals(对象)---------------比较两个对象的内存地址 可以被重写,重写后比较 ...

  5. 浅谈箭头函数和setTimeout中的this

    箭头函数会改变this的指向,这个大家看文档都看到过,可是有没有具体理解呢?我发现自己应该可能大概是......emmmm,然后我整理了一遍,加强一下概念吧顺带再讲一下setTimeout这个函数改写 ...

  6. 【HDOJ 1272】小希的迷宫(并查集+无环图)

    描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道 ...

  7. 【cisco下针对冗余链路故障备份的处理措施】

    对于中小型的网络中,为了流量的分担,可制定负载均衡方案,但往往带来的是链路的冗余.导致多条物理线路不能够最大的发挥其作用:冗余链路随可避免环路,但在实际的网络中还是存在一些需要完善的地方: 假设有一组 ...

  8. React学习(2)—— 组件的运用和数据传递

    React官方中文文档地址:    https://doc.react-china.org/ 了解了组件之后,就需要理解“Props”和“State”的用法.首先来介绍State,State按照字面意 ...

  9. for循环小练习

    for循环是前测试循环语句 for(初始值:判定条件:步长){ 循环语句 } For循环原理: For循环第一次执行:首先执行语句1,然后执行语句2,如果条件为真,向内执行执行循环语句3. 如果条件为 ...

  10. Tensorflow 笔记:第一讲

    一. 基本概念 1. 什么是人工智能 人工智能的概念: 机器模拟人的意识和思维 重要人物: 艾伦·麦席森·图灵( Alan Mathison Turing) 人物简介: 1912 年 6 月 23 日 ...