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的第二天(更新,删除,查询,索引)的更多相关文章

  1. 《mongoDB》基本操作-创建/更新/删除文档

    一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo -  use db_name; 选择你要操作的集合 > use demo switched to db dem ...

  2. 2.MongoDB系列之创建更新删除文档

    1. 插入文档 // 单条插入 db.getCollection('blog').insertOne({'type': 'mongodb'}) // 批量 插入 db.getCollection('b ...

  3. .net core 对dapper 新增 更新 删除 查询 的扩展

    早期的版本一直用的是EF,但是EF一直有个让人很不爽的东西需要mapping 实体对象:如果没有映射的情况下连查询都没办法: 所以后来开始使用dapper 但是dapper都是直接用的是sql,这个对 ...

  4. TODO:MongoDB的查询更新删除总结

    TODO:MongoDB的查询更新删除总结 常用查询,条件操作符查询,< .<=.>.>=.!= 对应 MongoDB的查询操作符是$lt.$lte.$gt.$gte.$ne ...

  5. 三、MongoDB的创建、更新和删除

    一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 概要 下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D( ...

  6. MongoDB 常见的查询索引

    常见的查询索引 _id索引         _id 索引是绝大多数集合默认建立的索引.对于每一个插入的数据.MongoDB 会自己主动生成一条唯一的 _id 字段. 1 2 3 4 5 6 7 8 9 ...

  7. spring Mongodb查询索引报错 java.lang.NumberFormatException: empty String

    最近事情比较多,本篇文章算是把遇到的问题杂糅到一起了. 背景:笔者最近在写一个mongo查询小程序,由于建立索引时字段名用大写,而查询的时候用小写. 代码如下: db.getCollection(&q ...

  8. mongodb 跟踪SQL语句及慢查询收集

    有个需求:跟踪mongodb的SQL语句及慢查询收集 第一步:通过mongodb自带函数可以查看在一段时间内DML语句的运行次数. 在bin目录下面运行  ./mongostat -port 端口号  ...

  9. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

随机推荐

  1. it公司比较

    1:本人西电通院2013届毕业硕士,根据今年找工作的情况以及身边同学的汇总,总结各大公司的待遇如下,吐血奉献给各位学弟学妹,公司比较全,你想去的公司不在这里面,基本上是无名小公司了:但无名小公司有时也 ...

  2. Jenkins + docker ,容器中跑docker服务

    1. 宿主机:安装docker 2. 启动jenkins服务 https://jenkins.io/download/ Jenkins官网找自己需要的镜像版本号进行使用. docker run -it ...

  3. go中的数据结构接口-interface

    1. 接口的基本使用 golang中的interface本身也是一种类型,它代表的是一个方法的集合.任何类型只要实现了接口中声明的所有方法,那么该类就实现了该接口.与其他语言不同,golang并不需要 ...

  4. 利用GitHub Pages + jekyll快速搭建个人博客

    前言 想搭建自己博客很久了(虽然搭了也不见得能产出多频繁). 最初萌生想写自己博客的想法,想象中,是自己一行一行码出来的成品,对众多快速构建+模板式搭建不屑一顾,也是那段时间给闲的,从前后端选型.数据 ...

  5. try-with-resources优先于try-finally

    参考资料:<Effective Java>.<Java核心技术 卷1>.https://www.cnblogs.com/flyingeagle/articles/1015292 ...

  6. 技术人如何利用 github+Jekyll ,搭建一个独立免费的技术博客

    上次有人留言说,技术博客是程序员的标配,但据我所知绝大部分技术同学到现在仍然没有自己的技术博客.原因有很多,有的是懒的写,有的是怕写不好,还有的是一直想憋个大招,幻想做到完美再发出来,结果一直胎死腹中 ...

  7. IDEA+SpringBoot+Mybatis+maven分布式项目框架的搭建

    参考文章:https://blog.csdn.net/qq_34410726/article/details/98214992 一.maven分布式工程的基本架构 demo  #父工程模块,主要用来定 ...

  8. 宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  9. Springboot操作Elasticsearch

    常见的日志系统是基于logstach+elasticsearch+kibna框架搭建的,但是有时候kibana的查询无法满足我们的要求,因此有时需要代码去操作es,本文后续都以es代替elastics ...

  10. 数据库求闭包,求最小函数依赖集,求候选码,判断模式分解是否为无损连接,3NF,BCNF

    1.说白话一点:闭包就是由一个属性直接或间接推导出的所有属性的集合. 例(1):   设有关系模式R(U,F),其中U={A,B,C,D,E,I},F={A→D,AB→E,BI→E,CD→I,E→C} ...