MongoDB的第二天(更新,删除,查询,索引)
Mongodb的更新方式有三种
update函数,操作符更新,save函数
update:
语法格式:db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选)})
db.develop.update({title:'莣尔'},{name:'wee'})
save:save() 方法通过传入的文档来替换已有文档
db.develop.save({ "_id" : ObjectId("5dbc2dace0be87b845e21e24"),name:'llss'})
操作符更新
$set 操作符:用来指定一个键并更新键值,若键不存在并创建。
语法格式:db.COLLECTION_NAME.update({查询条件},{更新操作符:{更新内容}})
db.develop.update({title:'莣尔'},{$set:{name:'wee'}})
$inc 操作符 :可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
db.develop.update({name:'kl'},{$inc:{age:2}})
$unset 操作符:主要是用来删除键。格式和上面类似
db.develop.update({name:'ls'},{$unset:{sex:'man'}})
$push 操作符 :向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添加时键存在,要求键值类型必须是数组;键不存在,则创建数组类型的键。
db.develop.update({name:'ls'},{$push:{age:24}})
$pop 操作符:删除数据元素。1 表示从数组的尾部删除
db.develop.update({name:'zss'},{$pop:{tags:1}})
$pull 操作符:从数组中删除满足条件的元素
db.develop.update({name:'wee'},{$pull:{tags:'看电影'}})
$pullAll 操作符:从数组中删除满足条件的多个元素
$rename 操作符:对键进行重新命名。
db.develop.update({name:'wee'},{$rename:{tags:'hobby'}})
删除文档的三种方式
使用 remove()函数可删除集合中的指定文档。
语法格式:remove({指定删除条件},删除参数(可选参数))
db.develop.remove({"_id" : ObjectId("5dbc1c14e0be87b845e21e18")}
如果使用的条件在集合中可以匹配多条数据,那么 remove()函数会删除所有满足条件的数据。我们可以在 remove 函数中给定 justOne,表示只删除第一条,在 remove 函数中给定参数 1 即可。
注意:remove() 方法 并不会真正释放空间。需要继续执行 db.repairDatabase() 来回收磁盘空间。
deleteOne()函数是官方推荐删除文档的方法。该方法只删除满足条件的第一条文档。
deleteMany 函数是官方推荐的删除方法。该方法删除满足条件的所有数据。
文档的查询
find({查询条件(可选)},{指定投影的键(可选)})
如果未给定参数则表示查询所有数据。
查询所有
db.develop.find()
pretty()函数可以使用格式化的方式来显示所有文档。
db.develop.find().pretty()
findOne()函数只返回满足条件的第一条数据。如果未做投影操作该方法则自带格式化功能。
语法格式:findOne({查询条件(可选)},{投影操作(可选)})
模糊查询
通过//与^ $实现模糊查询
注意使用模糊查询时查询条件不能放到 双引号或单引号中。
db.develop.find({name:/w/})含有w
db.develop.find({name:/w$/})以w结尾
db.develop.find({name:/^w/})以w开头
投影操作
语法格式为:find({查询条件},{投影键名:1(显示该列)|0(不显示该列),投影键名:1|0,......})
db.develop.find({},{name:1,_id:0,title:1})
findOne 函数投影操作
语法格式为:findOne({查询条件},{投影键名:1(显示该列)|0(不显示该列)})
db.develop.findOne({},{name:1,_id:0,title:1})
条件运算符
$gt
(>) 大于操作符
我们可以使用$gt 操作做大于的条件判断。该操作符可以数字或日期进行判断。
db.develop.find({age:{$gt:20}})
$lt
(<) 小于操作符
我们可以使用$lt 操作做小于的条件判断。该操作符可以数字或日期进行判断。
db.develop.find({age:{$lt:20}})
$gte
(>=)大于或等于操作符
我们可以使用$gte 操作做大于或等于的条件判断。该操作符可以数字或日期进行判断。
db.develop.find({age:{$gte:30}})
$lte
(<=)小于或等于操作符
我们可以使用$lte 操作做小于或等于的条件判断。该操作符可以数字或日期进行判断。
db.develop.find({age:{$lte:30}})
$eq
(==)等于操作符
我们可以使用$eq 操作做相等的条件判断。
db.develop.find({age:{$eq:30}})
$ne
(!=)不等操作符
我们可以使用$ne 操作做不等的条件判断。
db.develop.find({age:{$ne:30}}) 没有年龄字段的也算不等
排序:
举个栗子:查询所有数据,按照年龄的升序来排,如果年龄相同,按照姓首字母降序排
db.develop.find().sort({age:1,name:-1})
创建索引
db.develop.createIndex({age:1})
查看索引
db.develop.getIndexes()
db.develop.getIndexSpecs()
db.develop.totalIndexSize()
db.develop.totalIndexSize([1])
删除索引
1.删除指定索引
db.develop.dropIndex('tags_1')
删除集合中的全部索引,_id 键的索引除外
db.develop.dropIndex()
索引类型
单字段索引(Single Field Index)
我们可以使用createIndexes({索引键:排序规则})函数来创建单字段索引
db.develop.createIndex({age:1})
交叉索引
交叉索引就是为一个集合的多个字段分别建立索引,在查询的时候通过多个字段作为查询条件,这种情况称为交叉索引。
在查询文档时,在查询条件中包含一个交叉索引键或者在一次查询中使用多个交叉索引键作为查询条件都会触发交叉索引。
复合索引
Single Field Index 的升级版本,它针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,依次类推。
语法格式:db.COLLECTION_NAME.createIndex({索引键名:排序规则, 索引键名:排序规则,......});
复合索引能满足的查询场景比单字段索引更丰富,不光能满足多个字段组合起来的查询,也能满足所以能匹配符合索引前缀的查询。
多key索引
当索引的字段为数组时,创建出的索引称为多 key 索引,多 key 索引会为数组的每个元素建立一条索引
唯一索引
将字段的值保证在集合中是唯一的,不可重复,而且必须存在
部分索引
只针对符合某个特定条件的文档建立索引,3.2 版本才支持该特性。
MongoDB 部分索引只为那些在一个集合中,满足指定的筛选条件的文档创建索引。由于部分索引是一个集合文档的一个子集,因此部分索引具有较低的存储需求,并降低了索引创建和维护的性能成本。部分索引通过指定过滤条件来创建,可以为 MongoDB 支持的所有索引类型使用部分索引。
简单点说:部分索引就是带有过滤条件的索引,即索引只存在与某些文档之上
语 法 格 式 : db.COLLECTION_NAME.createIndex({ 索引键名 : 排序规则},{partialFilterExpression:{键名:{匹配条件:条件值}}})
稀疏索引(sparse index)
稀疏索引仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的任何文档。索引是“稀疏的”,因为它不包含集合的所有文档。相反,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。
语法格式:db.COLLECTION_NAME.createIndex({索引键名:排序规则},{sparse:true})
db.develop.createIndex({name:-1},{sparse:true})
覆盖索引
1. 所有的查询字段是索引的一部分
2. 所有的查询返回字段在同一个索引中
由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。 因为索引存在于 RAM 中,从索引中获取数据比通过扫描文档读取数据要快得多。
db.stu.createIndex({title:1,:size:1}) |
那么执行如下查询时,该索引会覆盖查询:
db.stu.find({title:"dev"},{size:1,_id:0}) |
也就是说,对于上述查询,MongoDB 的不会去数据库文件中查找。相反,它会从索引中提取数据,这是非常快速的数据查询。
由于我们的索引中不包括 _id 字段,_id 在查询中会默认返回,我们可以在 MongoDB的查询结果集中排除它。
使用索引需要注意
既然索引可以加快查询速度,那么是不是只要是查询语句,就创建索引呢?答案是否定的。因为索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间,
同时索引会加重插入、删除和修改记录时的负担,另外,数据库在运行时也要消耗资源维护索引,因此索引并不是越多越好。
那么什么情况不建议创建索引呢?例如一两千条甚至只有几百条记录的表,没必要建索引,让查询做全集合扫描就好了。至于多少条记录才算多?我个人建议以 2000 作为分界线,记录数不超过 2000 可以考虑不建索引,超过 2000 条可以酌情考虑创建索引。
索引限制指的是
1 额外开销
每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。
所以,如果你很少对集合进行读取操作,建议不使用索引。
2 内存使用
由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。
如果索引的大小大于内存的限制,MongoDB 会删除一些索引,这将导致性能下降。
3 查询限制
索引不能被以下的查询使用:
正则表达式(最左匹配除外)及非操作符,如 $nin, $not, 等。算术运算符,如 $mod, 等。
所以,检测你的语句是否使用索引是一个好的习惯,可以用 explain 来查看。8.11.4 最大范围
集合中索引不能超过 64 个
索引名的长度不能超过 128 个字符
一个复合索引最多可以有 31 个字段
MongoDB的第二天(更新,删除,查询,索引)的更多相关文章
- 《mongoDB》基本操作-创建/更新/删除文档
一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo - use db_name; 选择你要操作的集合 > use demo switched to db dem ...
- 2.MongoDB系列之创建更新删除文档
1. 插入文档 // 单条插入 db.getCollection('blog').insertOne({'type': 'mongodb'}) // 批量 插入 db.getCollection('b ...
- .net core 对dapper 新增 更新 删除 查询 的扩展
早期的版本一直用的是EF,但是EF一直有个让人很不爽的东西需要mapping 实体对象:如果没有映射的情况下连查询都没办法: 所以后来开始使用dapper 但是dapper都是直接用的是sql,这个对 ...
- TODO:MongoDB的查询更新删除总结
TODO:MongoDB的查询更新删除总结 常用查询,条件操作符查询,< .<=.>.>=.!= 对应 MongoDB的查询操作符是$lt.$lte.$gt.$gte.$ne ...
- 三、MongoDB的创建、更新和删除
一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 概要 下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D( ...
- MongoDB 常见的查询索引
常见的查询索引 _id索引 _id 索引是绝大多数集合默认建立的索引.对于每一个插入的数据.MongoDB 会自己主动生成一条唯一的 _id 字段. 1 2 3 4 5 6 7 8 9 ...
- spring Mongodb查询索引报错 java.lang.NumberFormatException: empty String
最近事情比较多,本篇文章算是把遇到的问题杂糅到一起了. 背景:笔者最近在写一个mongo查询小程序,由于建立索引时字段名用大写,而查询的时候用小写. 代码如下: db.getCollection(&q ...
- mongodb 跟踪SQL语句及慢查询收集
有个需求:跟踪mongodb的SQL语句及慢查询收集 第一步:通过mongodb自带函数可以查看在一段时间内DML语句的运行次数. 在bin目录下面运行 ./mongostat -port 端口号 ...
- 我的MYSQL学习心得(八) 插入 更新 删除
我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...
随机推荐
- EFK教程 - ElasticSearch高性能高可用架构
通过将elasticsearch的data.ingest.master角色进行分离,搭建起高性能+高可用的ES架构 作者:"发颠的小狼",欢迎转载与投稿 目录 ▪ 用途 ▪ 架构 ...
- 雅虎日本如何用 Pulsar 构建日均千亿的消息平台
雅虎日本是一家雅虎和软银合资的日本互联网公司,是日本最受欢迎的门户网站之一.雅虎日本的互联网服务在日本市场占主导地位. 下图从三个维度显示了雅虎日本的经营规模.第一个是服务数量,雅虎日本提供上百种互联 ...
- Linux 解决ntfs文件系统问题,支持外设(U盘等设备)的即插即拔
# rpm -q fuse //查看这个软件有没有安装,一般安装系统都会装(最小安装例外) fuse-2.9.2-10.el7.x86_64 # yum -y install gcc # wget h ...
- PHP Swoole-Demo TCP服务端简单实现
tcp 服务端简单demo与client . <?php /** * author : rookiejin <mrjnamei@gmail.com> * createTime : 2 ...
- PHP 教你使用 Swoole-Tracker 秒级定位 PHP 卡死问题
PHPer 肯定收到过这样的投诉:小菊花一直在转!你们网站怎么这么卡!当我们线上业务遇到这种卡住(阻塞)的情况,大部分 PHPer 会两眼一抹黑,随后想起那句名言:性能瓶颈都在数据库然后把锅甩给DBA ...
- 动手造轮子:实现简单的 EventQueue
动手造轮子:实现简单的 EventQueue Intro 最近项目里有遇到一些并发的问题,想实现一个队列来将并发的请求一个一个串行处理,可以理解为使用消息队列处理并发问题,之前实现过一个简单的 Eve ...
- Vue_声明周期
Vue生命周期 在vue2.0的时候,声明钩子发生了改变,具体有八个 <!-- HTML部分 --> <div id="app"> <div>{ ...
- 缓冲&缓存&对象池概念的理解
一).缓冲 作用:缓解程序上下层之间的性能差异. 1).当上层组件的性能优于下层组件时加入缓冲机制可以减少上层组件对下 层组件的等待时间. 2).上层组件不需要等待下层组件接收全部数据,即可返回操作, ...
- C++程序的耦合性设计
声明:本文部分采用和参考<代码里的世界观-通往架构师之路>中内容,可以说是该书中耦合性一章的读后感,感谢该书的作者余叶老师的无私分享. 1.什么是耦合? 耦合其实就是程序之间的相关性. 程 ...
- 【Luogu P3375】字符串匹配KMP算法模板
Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...