目录
统计操作符
聚合操作
聚合管道
文件存储
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