网站首页 > 基础教程 正文
练习:
文档机构同上次
创建一个数据库 名字为 grade
数据库中创建集合集合名称为 class
向集合中插入若干文档文档结构如下
{name:‘小红’,age:10,sex:‘w’,hobby:['a','b'],score:{‘chinese’:88,‘english’:76,‘math’:91}}
1. 将该班中姓名为小红的学生年龄变为8岁,兴趣爱好变为跳舞画画
{$set:{age:8,hobby:['dance','drawing']}}
2. 追加 小明的兴趣爱好,增加唱歌
{$push:{hobby:'sing'}}
3.增加小王兴趣爱好,吹牛和打篮球
{$pushAll:{hobby:['chuiniu','basketball']}}
4.追加小李兴趣爱好,吹牛,唱歌,要保证和原有爱好不重复
{$addToSet:{hobby:{$each:['chuiniu','sing']}}}
5.给该班所有同学年级增加1岁
{$inc:{age:1},false,true}
6.删除小明同学的sex属性
{$unset:{sex:1}}
7.删除小明兴趣爱好中的第一项
{$pop:{hobby:-1}}
8.删除小红兴趣中的画画
{$pull:{hobby:'drawing'}}
索引 : 指的是建立指定键值及所在文档存储位置的对照关系清单。使用索引可以更方便我们快速查找,减少遍历,提高效率。
如果不适用索引则在查找中使用全表扫描,效率较低
创建索引:
ensureIndex
给student集合中按照name创建索引
db.student.ensureIndex({'name':1})
* 1表示正向索引,-1表示逆向索引,根据需要进行创建
查看当前集合中的索引
getIndexes()
e.g.:
db.student.getIndexes()
* 默认情况下_id是系统自动为我们创建的索引
创建复合索引 (可以同时给多个域创建索引)
e.g.:
db.student.ensureIndex({'name':1,'age':-1})
删除索引
dropIndex()
db.student.dropIndex({'name':1})
删除所有索引
db.student.dropIndexes()
* 注意 不会删除_id上的索引
显示查找操作的详细信息
explain()
索引类型:
数组索引 : 如果对某个域创建索引,这个域对应的值是一个数组。那么会对数组中的每个值依次创建索引
目的 : 提高数组查找的效率
e.g.:
db.student.find({hobby:'football'},{_id:0})
子文档索引
如果某个域的值是一个文档,那么可以针对这个子文档中的某个域单独创建子文档索引。
e.g.:
db.class2.ensureIndex({'book.price':1})
唯一索引 :
唯一索引希望创建索引的键都拥有不重复的值。
可以通过创建唯一索引来约束键对应的值
db.student.ensureIndex({name:1},{'unique':true})
覆盖索引
定义:不获取具体文档,仅从索引中就可以获取到全部的查询数据
如何使用: 查询时,限定返回的数据仅包含索引中的数据,排除不再索引中的键
db.student.ensureIndex({name:1,age:1})
只显示索引项
db.student.find({name:'Levi'},{_id:0,name:1})
稀疏索引(间隙索引):
只针对有score域的文档进行索引创建,跳过不存在这个域的文档
db.student.ensureIndex({score:1},{sparse:true})
文本索引:
使用文本索引可以较快速的进行文本检索,文本索引可以建立在任何格式的字符串上。
1.创建文本索引
db.class1.ensureIndex({Geyan:'text',description:'text'})
2. 以空格作为分割,只要对应文本中包含其中一部分就可以找到相应的文档
db.class1.find({$text:{$search:"python java PHP"}})
3.如果查找的字符串中本身包含空格 则使用内部引号引起来
db.class1.find({$text:{$search:"\"love python\""}},{_id:0})
4.可以检索出不包含某个字符串的文档
查找包含 I love 但是不包含go的文档
db.class1.find({$text:{$search:"'i love' -go"}},{_id:0})
5 删除文本索引
*先用getIndexes()查看文档的名字
*按照名字进行删除
e.g.:
db.class1.dropIndex('Geyan_text_description_text')
索引约束:
1.影响插入,删除,修改数据的效率,当对数据的修改发生时,不仅需要更新文档,还需要更新索引
2.占用了一定的存储空间,在数据量较小的集合中不宜创建索引。
综上 :索引不是越多越好,而是看实际对数据的常用操作
固定集合:
mongo中固定集合指的是性能出色且有着固定大小的集合
作用: 处理日志
作为缓存
特点:插入数据快
顺序查询速度快
能够淘汰早期数据
db.createCollection('collectionName',{capped:true,size:10000})
e.g.:
db.createCollection('log',{capped:true,size:10000})
判断一个集合是否是固定集合
db.log.isCapped()
设置固定集合中最多有1000条数据 大小是10000kb
db.createCollection('mylog',{capped:true,size:10000,max:1000})
聚合
主要用于文档数据的统计计算。
db.class1.count() 统计集合中有多少文档
聚合方法 配合一定的聚合标识符来使用
db.class1.aggregate()
聚合标识符
$group 分组
$sum 求和
$avg 求平均数
$min 得到最小值
$max 得到最大值
$first 得到每组第一个
$last 得到每组最后一个
{$group:{_id:"$name" , num: {$sum:1}}}
分组 按照姓名 分组统计结果名称 求和
统计每个姓名的人数
db.class3.aggregate({$group:{_id:"$name",num:{$sum:1}}})
统计每名字的人的年龄之和
db.class3.aggregate({$group:{_id:"$name",num:{$sum:'$age'}}})
统计每名字的人的平均年龄
db.class3.aggregate({$group:{_id:"$name",num:{$avg:'$age'}}})
统计每名字的人的最小年龄
db.class3.aggregate({$group:{_id:"$name",num:{$min:'$age'}}})
统计每名字的人的最大年龄
db.class3.aggregate({$group:{_id:"$name",num:{$max:'$age'}}})
统计每名字的人的第一个的年龄
db.class3.aggregate({$group:{_id:"$name",num:{$first:'$age'}}})
统计每名字的人的最后一个的年龄
db.class3.aggregate({$group:{_id:"$name",num:{$last:'$age'}}})
$project
用于修改文档的显示结构
只显示name和age 同 find({},{_id:0,name:1,age:1})
db.student.aggregate({$project:{_id:0,name:1,age:1}})
显示数据中增加一个域Name,值是原来name域的值
db.student.aggregate({$project:{_id:0,name:1,age:1,Name:'$name'}})
* 当我们需要告知是哪个字段的时候是不必加$的
* 当我们需要得到这个字段的值得时候,需要加$
$match
用于过滤数据
db.student.aggregate({$match:{'age':18}})
db.student.aggregate({$match:{'age':{$gt:18}}})
$limit
取多少条结果
db.student.aggregate({$limit:2})
$skip
跳过多少条
db.student.aggregate({$skip:2})
$sort
排序
db.student.aggregate({$sort:{age:1}})
聚合管道:
前一个的聚合结果传给后一个继续操作
将match的结果,按照project输出结构输出,并按照sort排序
db.student.aggregate([{$match:{'age':{$gte:18}}},{$project:{_id:0,name:1,age:1}},{$sort:{age:1}}])
聚合练习
创建一个数据库 名字为 grade
数据库中创建集合集合名称为 class
向集合中插入若干文档文档结构如下
{name:‘小红’,age:10,sex:‘w’,hobby:['a','b'],score:{‘chinese’:88,‘english’:76,‘math’:91}}
1. 按照学生姓名进行分组,统计每组的人数
2. 按照学生姓名分组,统计人数,过滤人数大于1的学生
db.class.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
3.统计每名学生在考试中的总分
db.class.aggregate([{$group:{_id:'$_id',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}}])
4.统计每名男生考试中的总分
db.class.aggregate([{$match:{sex:'m'}},{$group:{_id:'$name',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}}])
5.统计每名男生考试中的总分,按降序显示
db.class.aggregate([{$match:{sex:'m'}},{$group:{_id:'$name',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}},{$sort:{score:-1}}])
GridFS
GridFS是mongo提供的一种文件的存储方式。
当文件大小 大于16M的时候可以使用这种方式进行存储
将文件存储在mongodb的集合中,通过两个集合共同位置该文件的存储
fs.files : 存储和文件相关的数据,文件名filename,文件类型content_type等
fs.chunks: 实际存储文件内容,以二进制方式分块存储
大文件会被分割为多个小块,每块作为fs.chunks集合中文档进行存储
存储文件
mongofiles -d dbName put filename
dbName : 将文件存储在哪个数据库,如果不存在则自动创建该数据库
filename:要存储的文件的名字 (大于16M)
查看存储的文件
db.fs.files.find()
从上一个命令获取对应文件的_id值,得到具体文件
db.fs.chunks.find({files_id:ObjectId(xxxxxxx)})
优缺点
优点: 1.存储方便
2.没有文件个数限制
3.加在方便
缺点 : 读写效率低 (比硬盘读写文件效率低)
只能整体替换,不能分块更新
游标
为什么用游标
1. 防止网络拥塞,造成数据传输慢
2. 避免客户端解析带来的客户的体验差,可以进行后端解析
综上,当查询结果数据量较大时,使用游标是一个不错的选择
使用方法:
var cursor = db.student.find()
cursor.hasNext() 查看是否有下一条文档
cursor.next() 获取下一条文档
**************************************************************************************************
python 的mongodb 接口
sudo pip3 install pymongo
总结:
基础操作
增 : insert() insert_many() insert_one()
save()
删 : remove()
*通过条件删除
*_id 删除
改 : update()
查 : find() find_one()
查询结果可以通过 字典的方式取具体某个域的值
在参数中支持
*参数的支持同mongo shell响应命令基本一致,只是在使用系统标识符的时候需要加上引号,以字符串的格式传入给python函数
*支持的操作符包括
1.比较操作符
$gt $gte $lt $lte $eq $ne $in $nin
2.逻辑操作符
$and $or $not $nor
3.一些函数
$type $exists ...
pymongo 支持几乎和 mongo shell相同的数组及内嵌文档的操作
索引操作
ensure_index()
create_index()
猜你喜欢
- 2024-10-29 57个挑战之57(part6):客户端+web前端+服务端代码实现
- 2024-10-29 技术干货|MongoDB数据库常见操作命令
- 2024-10-29 ABP vNext框架文档解读28-数据过滤
- 2024-10-29 自建MongoDB实践:MongoDB 分片集群
- 2024-10-29 小程序 随机读取数据并生成分享图片 上手笔记
- 2024-10-29 go-mongox:简单高效,让文档操作和 bson 数据构造更流畅
- 2024-10-29 当MongoDB遇见Spark mongodb campass
- 2024-10-29 MongoDB 5.0 官方文档学习笔记 mongodb教程
- 2024-10-29 好东西,MySQL 数据库 MongoDB详解
- 2024-10-29 优化MongoDB查询性能:针对百万级数据集的有效策略与实践
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- mysql教程 (60)
- pythonif (86)
- location.href (69)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)