整理来自

https://www.shiyanlou.com/courses/running/78

覆盖索引查询

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

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

范例:创建如下users集合(使用前面所学的方法创建该集合):

{"contact": "987654321","dob": "01-01-1991","gender": "M", "name": "Tom Benzamin", "user_name": "tombenzamin" } 

在user中创建一个联合索引

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

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

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

对于上述查询,MongoDB不会在数据库文件中查找,而会从索引中提取数据。因为索引中不包含_id字段,所以_id在查询中会默认返回,可以在查询结果中将其排除。而db.users.find({gender:"M"},{user_name:1})就不会被索引覆盖

高级索引

创建如下users集合(使用前面所学的方法创建该集合):

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

索引数组字段,在数组中创建索引,需要对数组中的每个字段依次建立索引。所以在我们为数组 tags 创建索引时,会为 music、cricket、blogs三个值建立单独的索引。 范例:

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

创建索引后,我们可以这样检索集合的 tags 字段:

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

为了验证我们使用使用了索引,可以使用 explain 命令:

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

以上命令执行结果中会显示 "cursor" : "BtreeCursor tags_1" ,则表示已经使用了索引。

索引子文档字段

假设我们需要通过city、state、pincode字段来检索文档,由于这些字段是子文档的字段,所以我们需要对子文档建立索引。 范例: 为子文档的三个字段创建索引,命令如下:

> 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"})

同样支持以下查询:

> db.users.find({"address.city":"chengdu","address.province":"sichuan","address.pincode":"123"}) 

四、原子操作

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

$set

用来指定一个键并更新键值,若键不存在并创建。

{ $set : { field : value } }

$unset

用来删除一个键。

{ $unset : { field : 1} } 

$inc

$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。

{ $inc : { field : value } }

$push

把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。

{ $push : { field : value } }

$pushAll

同$push,只是一次可以追加多个值到一个数组字段内。

{ $pushAll : { field : value_array } }

$pull

从数组field内删除一个等于value值。

{ $pull : { field : _value } }

$addToSet

增加一个值到数组内,而且只有当这个值不在数组内才增加。

$pop

删除数组的第一个或最后一个元素

{ $pop : { field : 1 } } 

$rename

修改字段名称

{ $rename : { old_field_name : new_field_name } }

$bit

位操作,integer类型

{$bit : { field : {and : 5}}} 

五、查询分析

explain()

explain 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化。接下来我们在 users 集合中创建 gender 和 user_name 的索引:

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

结果中字段解释:

  • indexOnly:为 true ,表示我们使用了索引;
  • cursor:因为这个查询使用了索引,MongoDB中索引存储在B树结构中,所以这是也使用了BtreeCursor类型的游标。如果没有使用索引,游标的类型是BasicCursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的system.indexes集合(系统自动创建)来得到索引的详细信息;
  • n:当前查询返回的文档数量;
  • nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好;
  • millis:当前查询所需时间,毫秒数;
  • indexBounds:当前查询具体使用的索引。

hint()

虽然MongoDB查询优化器一般工作的很不错,但是也可以使用hints来强迫MongoDB使用一个指定的索引。 通过这种方法在某些情形下会提升性能。 范例:指定使用 gender 和 user_name 索引字段来查询:

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

可以使用 explain() 函数来分析以上查询:

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

转载于:https://www.cnblogs.com/wind90/p/4606075.html

mongoDB高级查询与索引相关推荐

  1. MongoDB高级查询介绍

    title: MongoDB高级查询介绍 date: 2017-12-3 22:14:19 tags: MongoDB MongoDB查询 categories: 数据库 在几乎所有的项目中对数据库的 ...

  2. MongoDB高级查询详细

    前言 前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客  MongoDB下载安装与简单增删改查 前 ...

  3. mongoDB 高级查询(一)

    MongoDB,作为NoSql数据库,主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能.MongoDB支持的查询语言特别强大,几乎能实现关系型数据库单表查询的大多数功 ...

  4. lambdaquerywrapper查询指定字段_MongoDB系列 | 高级查询与索引(四)

    1 . 覆盖索引查询 ​所有的查询字段都是索引的一部分:所有的查询返回字段在同一个索引中. 由于索引存在于 RAM 中,因而从索引中获取数据要比扫描文档更快. 范例: 创建如下 users 集合(使用 ...

  5. mongoDB 高级查询之取模查询$mod

    http://hancang2000.i.sohu.com/blog/view/235140698.htm $mod取模运算 查询age取模10等于0的数据 db.student.find( { ag ...

  6. mongoDB高级查询

    2019独角兽企业重金招聘Python工程师标准>>> 条件查询 1.相等 db.inventory.find({ type: "snacks" }) 2.比较 ...

  7. mongodb 高级查询 统计记录条数

    使用count()方法查询表中的记录条数,例如,下面的命令查询表users的记录数量: db.users.find().count();

  8. Mongodb高级查询Aggregation聚合组件分页

    用Mongo的聚合组件Aggregation要用到两个方法skip和limit.skip设置起点(分页的时候不包含起点,从起点的下一行开始),limit设置条数.如: Aggregation.skip ...

  9. python mongodb分页查询_python数据库分页查询语句

    用django将数据从数据库提出并分页展示 不要笑这个太简单噢~~大神们路过的请自动忽略本文-- '''django有自带的分页功能,我这个是自己做的分页,效果其实是一样的. ''' 要把数据提出并展 ...

最新文章

  1. WinCE中命令行工具Viewbin简介(查看nk.bin中包含的文件)
  2. Redis数据库搭建主从同步(主从概念、主从配置、主从数据操作)
  3. 本年扩增子、宏基因组课程报名已满,想要学最早等明年
  4. git rebase和git merge的用法
  5. 易创课堂深圳干货,趁热下载
  6. gitee插件在androidstudio使用踩坑
  7. 袋鼠云大数据面试题回忆
  8. 正则表达式验证各种类型的数字
  9. ansible软件部署
  10. 算法:冒泡排序、一阶滤波
  11. 宇视NVR如何宇视云解绑?
  12. Excel查看多列重复项
  13. Flink电商指标分析项目(1)_项目整体工程搭建
  14. win10安装PHP环境
  15. 智能隐形眼镜的研究进展与挑战
  16. 软件工程作业-方舟学习笔记08-部分原理(续
  17. 单身职场人士怎么利用晚上时间提高自己?
  18. Java——去掉小数点后面多余的0
  19. [人工智能-深度学习-33]:卷积神经网络CNN - 常见分类网络- LeNet网络结构分析与详解
  20. Android 资源文件layout-sw500dp、layout-w500dp和layout-h500dp的区别

热门文章

  1. linux常用目录操作命令
  2. java堆是gc管理_JVM内存管理及GC机制
  3. mysql5.7 单机多实例_MySQL数据库 5.7.21单机多实例安装
  4. C# 开发和使用中的32个技巧
  5. useful websites for constructing your own website
  6. socat命令如何监听Linux串口设备通讯报文
  7. esri-leaflet入门教程(5)- 动态绘制图形
  8. android gps转换度分秒,如何将GPS数据转换为度分秒
  9. 与同步传递相关的获取-释放序列
  10. Doris之动态分区(全面)