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. SqlServer2005 查询 第五讲 top

    今天我们来说sql命令中得参数top top top[ 最前面若干个记录,专属于SqlServer2005的语法,不可移植到其他库.oracle中是用rownum<6来实现输出前5行记录.] 下 ...

  2. MySQL的安装+可视化工具+JDBC的增删改查

    1.Mysql和可视化工具的安装 安装包网上有很多资源.这里推荐一个我一直在用的学习网站,上面有提供安装包和详细的说明. http://how2j.cn/k/mysql/mysql-install/3 ...

  3. Python字符串类型判断错误

    Python里面常用的字符串类型有str和unicode,如果要判断一个对象的类型,最好用basestring,否则可能会判断错误: str1 = "hello" str2 = u ...

  4. nyoj 44-子串和(子串和最大问题)

    44-子串和 内存限制:64MB 时间限制:5000ms Special Judge: No accepted:12 submit:48 题目描述: 给定一整型数列{a1,a2...,an},找出连续 ...

  5. C语言|博客作业02

    这个作业属于哪个课程 C程序语言设计 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/8654 我在这个课程的目标是 ...

  6. 看源码学编程系列之kafka(一)

    kafka 由于它自身的高性能发送与消费能力,而受到广大企业的喜欢,所以我们就先看看kafka 一些源码实现如下: public void run() { int messageNo = 1; whi ...

  7. Pytorch文本分类(imdb数据集),含DataLoader数据加载,最优模型保存

    用pytorch进行文本分类,数据集为keras内置的imdb影评数据(二分类),代码包含六个部分(详见代码) 使用环境: pytorch:1.1.0 cuda:10.0 gpu:RTX2070 (1 ...

  8. 利用Python学习线性代数 -- 1.1 线性方程组

    利用Python学习线性代数 -- 1.1 线性方程组 本节实现的主要功能函数,在源码文件linear_system中,后续章节将作为基本功能调用. 线性方程 线性方程组由一个或多个线性方程组成,如 ...

  9. SpringSecurity退出功能实现的正确方式

    本文将介绍在Spring Security框架下如何实现用户的"退出"logout的功能.其实这是一个非常简单的功能,我见过很多的程序员在使用了Spring Security之后, ...

  10. Maven入门【小白千万别点进】

    曾经有个女孩问我为什么要学Maven,我吧唧嘴就怼:Maven项目没有jar包它不香嘛,照样运行它不香嘛?如果让我一句话形容Maven,我会这样形容:"妈妈再也不用担心小明拿U盘去小红电脑里 ...