2.5.5 MongoDB -- 聚合

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

排序

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

索引类型

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

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

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

创建索引

// 创建索引,-1 代表降序方式创建
db.collection.createIndex( { name: -1 } ) // 复合索引
db.products.createIndex( { "item": 1, "stock": 1 } ) //多键索引
{ _id: 1, item: "ABC", ratings: [ 2, 5, 9 ] } db.survey.createIndex( { ratings: 1 } ) //地理空间索引
db.places.insert(
{
loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
name: "Central Park",
category : "Parks"
}
) db.places.createIndex( { loc : "2dsphere" } ) //文本索引,一个集合只能创建一个
db.reviews.createIndex( { comments: "text" } ) db.reviews.createIndex(
{
subject: "text",
comments: "text"
}
) // 索引属性(唯一索引)
db.members.createIndex( { "user_id": 1 }, { unique: true } ) // 索引属性(TTL索引),可以设置过期时间
db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } ) // 索引属性(不区分大小写索引)
db.collection.createIndex( { "key" : 1 },
{ collation: {
locale : <locale>,
strength : <strength>
}
} ) // 索引属性(稀疏索引)
db.addresses.createIndex( { "xmpp_id": 1 }, { sparse: true } ) // 索引属性(部分索引)
db.restaurants.createIndex(
{ cuisine: 1, name: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)

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

低效操作:

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

使用索引的场景:

  • 集合较大
  • 文档较大
  • 选择性查询
// 后台创建索引,如果使用工具线程,可能会阻塞查询
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. 腾讯牛逼!终于开源了自家的 Tencent JDK——Kona!!.md

    是的,继阿里 2019/03 开源基于 OpenJDK 的长期支持版本 Alibaba Dragonwell 之后,腾讯也发布了自家的开源免费的 JDK 版本--Tencent Kona,必须替小马哥 ...

  2. moviepy音视频剪辑:视频半自动追踪人脸打马赛克

    一.引言 在<moviepy1.03音视频剪辑:使用manual_tracking和headblur实现追踪人脸打马赛克>介绍了使用手动跟踪跟踪人脸移动轨迹和使用headblur对人脸进行 ...

  3. PyQt(Python+Qt)学习随笔:字体writingSystem、ProportionalFonts、MonospacedFonts的含义以及QFontComboBox字体组合框详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在介绍QFontComboBox之前,我们先简单介绍一下字体 ...

  4. OutputFormat---自定义输出方式

    简介 可以自定义输出的格式和文件,例如包含某字段的输出到一个指定文件,不包含某字段的输出到另一个文件. 案例 数据 www.nevesettle.com www.baidu.com www.qq.co ...

  5. pandas 获取列名

    df.columns.values df.columns.values.tolist()

  6. 【坑点集合】C++ STL 使用注意事项整理

    Intro 简单整理了一些关于 C++ STL 的注意点. 虽然大多数东西可以手写不过某些东西最好少造轮子,善用 STL 可以节约很多考场时间,简化实现. 当然是时空限制和功能足够的前提下. Tips ...

  7. sort by背后使用了什么排序算法

    用到了快速排序,但不仅仅只用了快速排序,还结合了插入排序和堆排序 搬运自https://blog.csdn.net/qq_35440678/article/details/80147601

  8. SpringBoot使用Mybatis-plus及分页功能的细节部分

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  9. mysql 8.0 主从复制配置

    背景: 主库: 192.168.211.128 从库: 192.168.211.129 一.关闭防火墙 [root@node01 ~]# systemctl disable firewalld [ro ...

  10. DHCP spooping非法获取地址设置原理

    一.DHCP概述 DHCP(动态主机配置协议)是一个局域网的网络协议.指的是由服务器控制一段IP地址范围,客户机登录服务器时就 可以自动获得服务器分配的IP地址和子网掩码.默认情况下,DHCP作为Wi ...