贺胖娇的编程之旅......

蓝桥教程-MongoDB基础教程-高级查询与索引

2022.05.05

本系列基于对MongoDB基础教程的学习笔记

索引查询

覆盖索引查询

概念

所有的查询字段都是索引的一部分;所有的查询返回字段在同一个索引中。

由于索引存在于 RAM 中,因而从索引中获取数据要比扫描文档更快。

示例

例如有一个索引:

> db.users.ensureIndex({gender:1,user_name:1})

该索引会覆盖下面的查询:

db.users.find({gender:"M"},{user_name:1,_id:0})

由于默认会有_id被查出来,因此不排除_id就不会使用覆盖索引

高级索引

对数组建立索引

对数组字段创建索引时,内部会对数组中每个字段依次建立索引,可以直接检索字段

示例

tags字段是一个数组

{
   "address": {
      "city": "chengdu",
      "province": "sichuan",
      "pincode": "123"
   },
   "tags": [
      "music",
      "cricket",
      "blogs"
   ],
   "name": "clound"
}

建立了以下索引:

db.users.ensureIndex({"tags":1})

检索字段时直接搜索也能用到索引:

> db.users.find({tags:"cricket"}) # 索引会加快这个命令的搜索速度

可以使用explain命令查看索引使用情况(和mysql类似)

> db.users.find({tags:"cricket"}).explain()

索引子文档字段

为子文档的字段建立索引:

db.users.ensureIndex({"address.city":1,"address.province":1,"address.pincode":1})

创建了索引后,使用子文档检索会命中索引:

db.users.find({"address.city":"chengdu"})
> db.users.find({"address.city":"chengdu","address.province":"sichuan"}) # 按照顺序也能命中索引

原子操作

概念

所谓原子操作,就是要么执行成功,要么执行失败, 执行成功完成既定任务,执行失败还原执行前的状态。

常见原子操作

操作 使用 含义
$set { $set : { field : value } } 用来指定一个键并更新键值,若键不存在则创建
$unset { $unset : { field : 1} } 用来删除一个键
$inc { $inc : { field : value } } $inc 可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作
$push { $push : { field : value } } 把 value 追加到 field 里面去,field 一定要是数组类型才行,如果 field 不存在,会新增一个数组类型加进去
$pushAll { $pushAll : { field : value_array } } 同 $push ,只是一次可以追加多个值到一个数组字段内
$pull { $pull : { field : _value } } 从数组 field 内删除一个等于 value 值
$addToSet { $addToSet : { field : value } } 增加一个值到数组内,而且只有当这个值不在数组内才增加
$pop { $pop : { field : 1 } } 删除数组的第一个或最后一个元素
$rename { $rename : { old_field_name : new_field_name } } 修改字段名称
$bit {$bit : { field : {and : 5}}} 位操作,integer 类型

查询分析

explain

explain() 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化

hint()

强制命中索引,语法:

db.worker.find({age:30},{age:1,_id:0}).hint({age:1,salary:1})

db.createUser({user:“hexiaojiao”,pwd:“jiao”,roles:[“root”]})

发表评论