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学习心得( ...
随机推荐
- Abp vNext 自定义 Ef Core 仓储引发异常
问题 在使用自定义 Ef Core 仓储和 ABP vNext 注入的默认仓储时,通过两个 Repository 进行 Join 操作,提示 Cannot use multiple DbContext ...
- sublime3中运行python文件
sublime3中运行python文件 tools->build system->new build stystem 粘贴下面代码{"cmd":["pytho ...
- Web微信开发工具无法输入中文?官方bug
Ctrl+shift+w 重启工具就OK啦
- nyoj 19-擅长排列的小明(STL-next_permutation())
19-擅长排列的小明 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:10 submit:16 题目描述: 小明十分聪明,而且十分擅长排列计算.比如给 ...
- 航空概论(历年资料,引之百度文库,PS:未调格式,有点乱)
航空航天尔雅 选择题1. 已经实现了<天方夜谭>中的飞毯设想.—— A——美国2. 地球到月球大约—— C 38 万公里3. 建立了航空史上第一条定期空中路线—— B——德国4. 对于孔明 ...
- Andorid开发中遇到的问题
最近开始学习开发Android App,找了本教程,学了一些基本知识后,就开始着手做一个例子. 我始终觉得在做中学,可能会稍微快一点.很快,一个具有初步功能的App被我撸出来了. 在模拟器上运行,我发 ...
- 在input输入值改变reducer里的值
输入值改变reducer里的值 通过store.dispatch传入reducer中,函数的第二个参数可以接收到 在reducer中 在todolist文件中 然后在把this.state中的值改变
- ES6的基础知识(一)
1.ECMAScript 6.0(以下简称ES6). 2.ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的其中一种实现. 3.对ES6支持的浏览器:超过 90% ...
- vue动态样式设置
思路: 通过 v-bind:class="true ? style1 : style2 " 配合三元表达式完成样式的切换 具体实现 //return设置控制的参数 //有多个需要样 ...
- MySQL 支持 emoji 图标存储
在MySLQ中 UPDATA 和 INSERT 数据的时候,如果数据上面带有emoji图标,例如:?.?.? 很容易更新或者插入不成功,导致报错. 1 2 Error: ER_TRUNCATED_WR ...