断网了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. servlet三种方式实现servlet接口

    简单介绍 Servlet接口实现类 1.Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet.HttpServlet. 2.HttpServlet指能够处理HTTP请 ...

  2. 動態SQL運用實例

    動態SQL運用實例 語法8.1.6之前: EXECUTE IMMEDIATE dynamic_sql_string [INTO {define_var1 [, define_var2] ... | p ...

  3. Aspose.cell C# 操作excel(通过批注信息给单元格赋值、批注信息获取公式得出结果并转PNG)

    if (fileName == "") return ""; var CurrentRow = 0; Workbook work = new Workbook( ...

  4. Hibernate知识点小结(三)-->一对多与多对多配置

    一.多表关系与多表设计 1.多表关系        一对一:            表的设计原则(分表原则):                优化表的性能                基于语意化分表 ...

  5. zepto 基础知识(5)

    81.width width() 类型:number width(value) 类型:self width(function(index,oldWidth){....}) 类型:self 获取对象集合 ...

  6. 关于truthy 和 falsy

    一,强制类型转换 JavaScript 在需要用到布尔类型值的上下文中使用强制类型转换(Type Conversion )将值转换为布尔值,比如:在条件语句或者循环语句中 一,truthy 在java ...

  7. 【TOJ 3660】家庭关系(hash+并查集)

    描述 给定若干家庭成员之间的关系,判断2个人是否属于同一家庭,即2个人之间均可以通过这些关系直接或者间接联系. 输入 输入数据有多组,每组数据的第一行为一个正整数n(1<=n<=100), ...

  8. 使用Linux命名将代码上传到GitHub

    GitHub代码上传教程 https://my.oschina.net/baishi/blog/520791 这篇文章讲得挺清楚的,但是在上传的时候出现了问题 ! [rejected] master ...

  9. 使用Ansible实现nginx+keepalived高可用负载均衡自动化部署

    本篇文章记录通过Ansible自动化部署nginx的负载均衡高可用,前端代理使用nginx+keepalived,端web server使用3台nginx用于负载效果的体现,结构图如下: 部署前准备工 ...

  10. 深入理解is_callable和method_exists

    一.函数解析 is_callable() 定义: (PHP 4 >= 4.0.6, PHP 5, PHP 7) is_callable — 检测参数是否为合法的可调用结构 bool is_cal ...