专业编程基础技术教程

网站首页 > 基础教程 正文

MongoDB 入门 day04 mongodb27017

ccvgpt 2024-10-29 13:21:13 基础教程 13 ℃

练习:

文档机构同上次

MongoDB 入门 day04 mongodb27017

创建一个数据库 名字为 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()

最近发表
标签列表