训练大纲MongoDb1
大家如果想快速有效的学习,思想核心是“以建立知识体系为核心”,具体方法是“守破离”。确保老师课堂上做的操作,反复练习直到熟练。
第145次(MongoDb)
学习主题:MongoDb
学习目标:
1.掌握mongodb文档的更新
2.掌握mongodb文档的删除
3.掌握mongodb文档的查找
4.掌握mongodb文档的条件操作符
5.掌握mongodb中的索引操作
对应视频:
http://www.itbaizhan.cn/course/id/16103.html
对应文档:
无
对应作业
- Mongodb的更新方式有?
update函数更新
操作符更新
save函数更新
- Mongodb的update更新?
db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选)})
db.dev.update({title:”Spring Data”},{title:”SpringData”})
- Mongodb的更新操作符有哪些 都是什么意思?
$set
用来指定一个键并更新键值,若键不存在则创建
$inc
对文档的某个值为数字型的键进行增减的操作
$unset
删除键
$push
向文档的某个数组类型的键添加一个数组元素,不顾虑重复的数据。添加时键存在,要求键值类型必须是数组;键不存在,则创建数组类型的键
$pop
删除数组元素,1表示从数组的尾部删除,-1表示从数组的头部删除
$pull
从数组中删除满足条件的元素
$pullAll
从数组中删除满足条件的多个元素
$rename
对键进行重新命名
- Mongodb的save()更新?
save({文档})
db.dev.save({“_id”:ObjectId(“5cf633a446e93dc3d95”),”title”:”Spring Data”})
- Mongodb删除文档的三种方式?
remove()函数
db.dev.remove({指定删除条件},删除参数(可选参数))
如果没有给出删除条件和删除参数则删除集合中的所有文档
deleteOne()函数
db.dev.deleteOne({删除条件})
删除只满足条件的第一条文档
deleteMany()函数
db.dev.deleteMany({删除条件})
删除满足条件的所有文档,如果没有给出删除条件则删除集合中的所有文档
- Mongodb如何实对文档的查询,请举例说明?
find()函数
db.dev.find({查询条件(可选)},{指定投影的键(可选)})
如果未给定参数则表示查询所有数据。
pretty()函数可以使用格式化的方式来显示所有文档。
findOne()函数
findOne({查询条件(可选)},{指定投影的键(可选)})
只返回满足条件的第一条数据。如果未做投影操作该方法自带格式化功能。
模糊查询
使用^表示起始位置
使用$表示结尾位置
使用模糊查询时查询条件不能放到双引号或者单引号中。
- Mongodb中的投影操作指的是?
在查询函数中指定投影键,1表示显示该列,0表示不显示该列。_id列为默认显示列。
Find({查询条件},{投影键名:1|0})
FindOne({查询条件},{投影键名:1|0})
- 条件运算符有哪些 分别什么意思?
$gt
大于操作符,可以使用$gt操作做大于的判断
$lt
小于操作符,可以使用$lt操作做小于的判断
$gte
大于等于操作符,可以使用$gte操作做大于等于的判断
$lte
小于等于操作符,可以使用$lte操作做小于等于的判断
$eq
等于操作符,可以使用$eq操作做等于的判断
$ne
不等于操作符,可以使用$ne操作做不等的判断
$and
并且操作符,可以使用$and操作表示多条件间的并且关系
find($and:[{条件一},{条件二}])
$or
或者操作符,可以使用$or操作表示多条件的或者关系
$type
基于BSON类型检索集合中匹配的数据类型并返回结果
8.1and和or如何联合使用?
例:查询title为test5并且size等于500,或者size小于400的文档
- 每页显示5条查看第5页的数据如何实现?
db.dev.find().skip(20).limit(5)
- 如何实现排序,两个条件如何排序 如年龄一致按照分数排序?
db.COLLECTION_NAME.find().sort({排序键:1})
如果使用两个条件进行排序,则使用逗号分隔两个排序条件
db.dev.find({size:{$type:"number"}}).sort({年龄:1,分数:-1})
- 如何创建索引?
db.COLLECTION_NAME.createIndex({创建索引的键:排序规则,......},{创建索 引的参数(可选参数)})
db.dev.createIndex({title:1},{background:true})
- 如何查看索引?
db.COLLECTION_NAME.getIndexse()
db.COLLECTION_NAME.getIndexSpecs()
- 删除索引有几种方式,分别举例说明?
删除指定索引
db.dev.dropIndex("title_1")
删除所有索引(_id键的索引除外)
db.dev.dropIndexes()
- 索引类型有哪些,有何作用?
单字段索引
在索引中只包含一个键,查询时可加速对该字段的各种查询请求
交叉索引
为一个集合的多个字段分别建立索引,在查询时通过多个字段作为查询条件,在查询文档时,在查询条件中包含一个交叉索引键或者在一次查询中使用多个交叉索引键作为查询条件都会触发交叉索引
复合索引
针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,复合索引不光能满足多个字段组合起来的查询,也能满足所有能匹配符合索引前缀的查询。
多key索引
当索引的字段为数组时,创建出来的索引为多key索引,多key索引会为数组的每个元素建立一条索引。
唯一索引
唯一索引会保证索引对应的键不会出现相同的值,如果唯一索引所在字段有重复数据写入时,会抛出异常
部分索引
为那些在一个集合中,满足指定的筛选条件的文档创建索引。由 于部分索引是一个集合文档的一个子集,因此部分索引具有较低的存储需求,并降低了索引 创建和维护的性能成本
稀疏索引
仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。索引会 跳过缺少索引字段的任何文档
- 使用索引需要注意什么?
索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间, 同时索引会加重插入、删除和修改记录时的负担,另外,数据库在运行时也要消耗资源维护 索引,因此索引并不是越多越好
当集合中的数据较多时创建索引,数据较少时不用创建索引,让查询直接做全集和扫描就好。
为常用查询结构建立合适的索引:当查询使用到多个字段的时候,尽量使用复合索引,而不是交叉索引。
复合索引的字段排列顺序:当我们的组合索引内容包含匹配条件以及范围条件的时候,比如包含用户名(匹配条件)以及年龄(范围条件),那么匹配条件应该放在范围条件之前。
查询时尽可能仅查询出索引字段:有时候仅需要查询少部分的字段内容,而且这部分内容刚好都建立了索引,那么尽可能只查询出这些索引内容,需要用到的字段显式声明(_id 字段需要显式忽略!)。因为这些 数据需要把原始数据文档从磁盘读入内存,造成一定的损耗。
对现有的数据大表建立索引的时候,采用后台运行方式:在对数据集合建立索引的过程中,数据库会停止该集合的所有读写操作,因此如果建立 索引的数据量大,建立过程慢的情况下,建议采用后台运行的方式,避免影响正常业务流程
- 索引限制指的是?
额外开销:每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。 所以,如果很少对集合进行读取操作,建议不使用索引。
内存使用:由于索引是存储在内存(RAM)中,应该确保该索引的大小不超过内存的限制。 如果索引的大小大于内存的限制,MongoDB 会删除一些索引,这将导致性能下降。
查询限制:索引不能被以下的查询使用: 正则表达式(最左匹配除外)及非操作符,如 $nin, $not, 等。 算术运算符,如 $mod, 等。 所以,可以用 explain 来查看是否使用索引。
最大范围:集合中索引不能超64个,索引名的长度不能超过128个字符,一个复合索引最多可以有31个字段
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。