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. Git连接GitHub仓库详解

    [Annotation]本文将从标题八开始,因为前七个标题是关于Git的基本操作,如果对Git的基本操作不了解的话,可以点击下方链接先看一下Git怎么使用. 关于Git的详细使用 八:创建SSH Ke ...

  2. MySQL数据库之MyISAM与InnoDB的区别

    MySQL数据库之MyISAM与InnoDB的区别 从以下几个方面: 1.存储结构 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义 ...

  3. nyoj 412 Same binary weight ()

    Same binary weight 时间限制:300 ms  |  内存限制:65535 KB 难度:3   描述 The binary weight of a positive  integer ...

  4. pat 1054 The Dominant Color(20 分)

    1054 The Dominant Color(20 分) Behind the scenes in the computer's memory, color is always talked abo ...

  5. nyoj 22-素数求和问题(打表)

    22-素数求和问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:41 submit:52 题目描述: 现在给你N个数(0<N<1000 ...

  6. 力扣(LeetCode)二进制求和 个人题解

    给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: ...

  7. linux下制作linux系统盘(光盘、U盘)

    cdrecord制作启动光盘 首先cdrecord -scanbus输出设备列表和标识,(我的此次为5,0,0)  [ˈrekərd] 然后用cdrecord -v dev=5,0,0 -eject ...

  8. Qt Framework 问题之 framework/Versions/A:bundle format unrecognized, invalid, or unsuitable

    在解决标题提到的问题之后,先来介绍下Qt Framework一些基本知识. 基于QT的Mac端工程,在打包时需要对所有需要嵌入到APP的framework及dylib文件进行手动签名处理. 一.签名处 ...

  9. Jmeter---第一天配置中文环境、安装jmeter插件

    一:安装就不在赘述,百度有很多优秀的文章.接下来开始我自己的学习笔记 二:设置JMETER,切换中文环境. 首先打开jmeter的安装目录,找到bin文件目录中的jmeter.propertie 打开 ...

  10. linux运维与实践

    1.容器云计算节点负载值高,通过top可以看到Load Average:70.1  71.3  70.8,虚拟机有8个cpu: cpu使用率高导致(R状态)? 同时在top中观察一段时间,消耗cpu最 ...