2.5.5 MongoDB -- 聚合

  • 排序
  • 索引类型
  • 创建索引

排序

  1. // 升序
  2. db.getCollection('author').find({}).sort({"age": 1}).limit(20)
  3. // 降序
  4. db.getCollection('author').find({}).sort({"age": -1}).limit(20)
  5. // 组合
  6. db.getCollection('author').find({}).sort({"age": 1, "name": -1}).limit(20)

索引类型

  • 单键索引
  • 复合索引
  • 多键索引
  • 地理空间索引
  • 文本索引
  • 索引属性
  • 唯一索引
  • TTL索引
  • 不区分大小写索引
  • 稀疏索引
  • 部分索引

https://docs.mongodb.com/manual/indexes/

  1. // 使用 explan 查看 mongo 查询过程中的执行情况
  2. db.author.find({"name": "user1"}).explain("executionStats")

创建索引

  1. // 创建索引,-1 代表降序方式创建
  2. db.collection.createIndex( { name: -1 } )
  3. // 复合索引
  4. db.products.createIndex( { "item": 1, "stock": 1 } )
  5. //多键索引
  6. { _id: 1, item: "ABC", ratings: [ 2, 5, 9 ] }
  7. db.survey.createIndex( { ratings: 1 } )
  8. //地理空间索引
  9. db.places.insert(
  10. {
  11. loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
  12. name: "Central Park",
  13. category : "Parks"
  14. }
  15. )
  16. db.places.createIndex( { loc : "2dsphere" } )
  17. //文本索引,一个集合只能创建一个
  18. db.reviews.createIndex( { comments: "text" } )
  19. db.reviews.createIndex(
  20. {
  21. subject: "text",
  22. comments: "text"
  23. }
  24. )
  25. // 索引属性(唯一索引)
  26. db.members.createIndex( { "user_id": 1 }, { unique: true } )
  27. // 索引属性(TTL索引),可以设置过期时间
  28. db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
  29. // 索引属性(不区分大小写索引)
  30. db.collection.createIndex( { "key" : 1 },
  31. { collation: {
  32. locale : <locale>,
  33. strength : <strength>
  34. }
  35. } )
  36. // 索引属性(稀疏索引)
  37. db.addresses.createIndex( { "xmpp_id": 1 }, { sparse: true } )
  38. // 索引属性(部分索引)
  39. db.restaurants.createIndex(
  40. { cuisine: 1, name: 1 },
  41. { partialFilterExpression: { rating: { $gt: 5 } } }
  42. )

覆盖索引:所有查询字段是索引的一部分,所有查询返回字段在同一个索引中

低效操作:

  • 取反效率低(比如不等于,因为等于会命中索引,取反不会)
  • $nin 总是进行全表扫描
  • 一次查询只能使用一个索引,$or 除外,但 $or 使用多个索引查询之后再将结果进行合并的效率并不高,所以不推荐使用(尽可能使用$in)
  • 嵌套对象字段索引与基本字段的处理方式一致

使用索引的场景:

  • 集合较大
  • 文档较大
  • 选择性查询
  1. // 后台创建索引,如果使用工具线程,可能会阻塞查询
  2. db.people.createIndex({zipcode: 1}, {background: true})

索引基数:数据类型多,索引基数高,索引效率高,如果数据比如性别只有男,女两种数据,索引效率低

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 聚合)--学习笔记的更多相关文章

  1. .NET 云原生架构师训练营(设计原则与模式)--学习笔记

    在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发.和维护的成本 目录 几个问题 为什么要学习设计模式 优良架构设计的具体指标 理解复杂系统 面向对象思想(指导复杂系统的分析.设计.实 ...

  2. .NET 云原生架构师训练营(权限系统 代码重构)--学习笔记

    目录 模块拆分 代码重构 模块拆分 代码重构 AuthenticationController PermissionController IAuthorizationMiddlewareResultH ...

  3. .NET 云原生架构师训练营(KestrelServer源码分析)--学习笔记

    目录 目标 源码 目标 理解 KestrelServer 如何接收网络请求,网络请求如何转换成 http request context(C# 可识别) 源码 https://github.com/d ...

  4. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  5. .NET 云原生架构师训练营(建立系统观)--学习笔记

    目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...

  6. .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记

    目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...

  7. .NET 云原生架构师训练营(模块二 基础巩固 敏捷开发)--学习笔记

    2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作, ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 介绍和基础)--学习笔记

    2.5.1 MongoDB -- 介绍 mysql vs mongo 快速开始 mysql vs mongo 对比 mysql mongo 数据存储 table 二维表结构,需要预先定义结构 json ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 问答系统)--学习笔记

    2.5.6 MongoDB -- 问答系统 MongoDB 数据库设计 API 实现概述 MongoDB 数据库设计 设计优化 内嵌(mongo)还是引用(mysql) 数据一致性 范式:将数据分散到 ...

  10. .NET 云原生架构师训练营(模块二 基础巩固 Scrum 团队)--学习笔记

    2.7.3 Scrum 团队 理想的环境 团队章程 如何组建 Scrum 团队 产品待办事项列表 用户故事 敏捷开发流程 理想的环境 5-9人 100% 跨职能 在一起 自组织 自组织 目标 授权 沟 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QTableWidget设置项的setItem方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件中setItem用于在表格部件QTableWidget创建后,设定指 ...

  2. 【Docker】 .Net Core 3.1 webapi 集成EF Code First,使用MySql进行业务操作 、配置swagger (三)

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  3. java中的反射(三)

    目录 一.反射 1.class类 2.访问字段 3.调用方法 4.调用构造方法 5.获取继承对象 6.动态代理 二.sping中的反射 本篇转自:https://depp.wang/2020/05/0 ...

  4. js将秒数转换为时分秒格式

    function secondToTimeStr(t) { if (!t) return; if (t < 60) return "00:" + ((i = t) < ...

  5. c++11-17 模板核心知识(十五)—— 解析模板之依赖型类型名称与typename Dependent Names of Types

    模板名称的问题及解决 typename规则 C++20 typename 上篇文章c++11-17 模板核心知识(十四)-- 解析模板之依赖型模板名称 Dependent Names of Templ ...

  6. ip 子网掩码、网络地址、广播地址计算

    例:已知ip  16.158.165.91/22子网掩码 根据22 得知子网掩码占22位 即:11111111.11111111.11111100.00000000   == 255.255.252. ...

  7. 自定义3D地图

    基于echarts的3D地图进行,直接将这代码粘贴到echarts的demo中即可呈现效果 var mygeo = { // 标准的geojson格式 "type": " ...

  8. Consul安装部署(Windows单机、Docker集群)

    1. Consul简介   Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发,基于 Mozilla Public Licen ...

  9. Java File类的简单使用

    Java File的简单使用(创建.删除.遍历.判断是否存在等) Java文件类以抽象的方式代表文件名和目录路径名.该类本身不能用来读数据或写数据,它主要用于磁盘上文件和目录的创建.文件的查找和文件的 ...

  10. 加快Linux上yum下载安装包的速度(以CentOS 7,安装gcc为例)

    今天在学习Linux的过程中,学到了关于包的安装问题:rpm包管理和yum在线管理两种方式:这里因为我在实验yum安装gcc出现了网速超级慢的问题,于是搜索解决方案,重新配置repo得以解决,记录整个 ...