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 个字段

 

posted @ 2019-12-11 08:56  sakura-yxf  阅读(267)  评论(0)    收藏  举报