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. Markdown基本语法小结

    目录 Typore Markdown基本语法 1.标题 一级标题 二级标题 三级标题 2.字体加粗 3.斜体 4.文本高亮 5.上标 6.下标 7.引用代码 1 8.代码引用2 9.代码引用3 10. ...

  2. mysql group by使用方法注意

    mysql group by使用方法注意 group by 后面只用能用having 不能加 where等域名

  3. Unity中用Mesh画一个圆环(二)

    中目标-生成完整面 在之前的内容中我们已经成功生成了一个面,接下来我们要生成剩下的面就很容易了. 我们把之前生成的面当作顶面,接着我们来生成底面. 还记得前面说过\(\color{#1E90FF}{D ...

  4. Jenkins+pipeline+参数构建+人工干预确定

    Jenkins+pipeline+参数构建+人工干预 实现了以下功能 1. 可以选择环境,单选:可以选择需要发布的项目,多选 2.发布过程可视化 3. 可以人工干预是否继续发布. 初始化配置需要很久, ...

  5. Chrome Extension 小试牛刀

    自从有了Chrome以后,就喜欢上了这个浏览器,从此IE 886了. 以前作爬虫,做登录,做数据采集,做数据处理等各种功能,后来H5出来后,出现了,除了Session/Cookie 出了Local S ...

  6. [软件使用][matlab]最近经常用到的一些函数的意思,和用法

    ① cat(dim,A,B)按指定的维度,将A和B串联,dim是维度,比如1,2.1指列,2指行: ②numel(A),返回数组中,元素的个数 ③gpuArray(A),在gpu中产生一个数组A,一般 ...

  7. Previous operation has not finished; run 'cleanup' if it was interrupted最简单有效的解决方法

    今天提交代码报错,看了看提示的错误,百度了一下,发现操作都比较繁琐,所以自己重新给一个最简单有效的. 有的要下载sqlite3.exe,借助它清空本地.svn\wc.db数据库文件里面的operati ...

  8. vux组件的样式变量的使用

    使用x-header,查看文档发现有个样式变量,可以改变x-header的样式 这玩意怎么用呢? 1.在项目中创建一个.less样式文件,例如我这里是创建一个src/style/vux_theme.l ...

  9. Java w3c离线手册

    提供给大家使用,懒得找: 前端后端一般都用的到  查看文档 1. JDK_API_1_6_zh_CN.CHM 2.     W3School离线手册(2018.04.01).chm 3.    jqu ...

  10. [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

    一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...