首先从业务角度出发,不必要的筛选条件和粗略的筛选条件会严重影响查询速度,比如 $or 查询和 $in 查询,视情况尽可能去掉。

程序中打印出查询条件的各部分,有 $match、$group。比如 PHP 中可以通过 var_export()。

由于 aggregate 执行主要是 pipeline 步骤,所以着重需要关注的是 $match 条件。

打印出的数组 json_encode 后可以在 Robo3T 等客户端中作为 aggregate 的条件使用。

关于 aggregate 查询条件的格式,可参考:https://studio3t.com/knowledge-base/articles/build-mongodb-aggregation-queries/

为了方便查看 json 条件格式,可以对json在线格式化,之后使用如 Example1.

aggregate() 后面直接带不了 explain() 方法,为了使用 explain() 方法查看索引使用情况等信息,复制出 $match 的 json 条件 到 find({ }) 中,然后带上 explain() 方法。

查看 explain() 显示的信息 queryPlanner 部分,里面有 winningPlan.stage 状态分析,如 Example2.

常见的 winningPlan.stage 如下:
  COLLSCAN:全表扫描
  IXSCAN      :索引扫描
  FETCH       :根据索引去检索指定document
  更多的可以搜索 mongodb explain 相关信息。

把 COLLSCAN 优化成  IXSCAN 使用索引,此时再看 winningPlan.inputStage.keyPattern 使用的索引字段是哪个。

如果 keyPattern 使用的是低效率的索引可以通过 hint 用法强制指定索引,支持普通查询和聚合查询。

普通查询的 hint 方法: ->find({})->hint({ diff_id: 1 })

聚合查询的 hint 参数:docs.mongodb.com,如 Example3.

Example1.

db.getCollection('diff_detail').aggregate(
[
{
"$match": {
"diff_id": ObjectId('71162dcf17a1f594edcc69bc'),
"pvalue": {
"$lt": 0.05
},
"vip": {
"$gt": 1
},
"$or": [{
"fc": {
"$gt": 1
}
}, {
"fc": {
"$lt": 1
}
}],
"diff_group": {
"$in": ["a1_vs_A1", "a2_vs_A2", "a3_vs_A3", "a4_vs_A4", "a5_vs_A5"]
}
}
},
{
"$group": {
"_id": {
"table_type": "$table_type",
"diff_group": "$diff_group"
},
"count": {
"$sum": 1
}
}
}
] );

Example2.

{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "xxxdb.diff_detail",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"$or" : [
{
"fc" : {
"$lt" : 1.0
}
},
{
"fc" : {
"$gt" : 1.0
}
}
]
},
{
"diff_id" : {
"$eq" : ObjectId("71162dcf17a1f594edcc69bc")
}
},
{
"pvalue" : {
"$lt" : 0.05
}
},
{
"vip" : {
"$gt" : 1.0
}
},
{
"diff_group" : {
"$in" : [
"a1_vs_A1",
"a2_vs_A2",
"a3_vs_A3",
"a4_vs_A4",
"a5_vs_A5"
]
}
}
]
},
"queryHash" : "22D09A47",
"planCacheKey" : "22D09A47",
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : [
{
"$or" : [
{
"fc" : {
"$lt" : 1.0
}
},
{
"fc" : {
"$gt" : 1.0
}
}
]
},
{
"diff_id" : {
"$eq" : ObjectId("71162dcf17a1f594edcc69bc")
}
},
{
"pvalue" : {
"$lt" : 0.05
}
},
{
"vip" : {
"$gt" : 1.0
}
},
{
"diff_group" : {
"$in" : [
"a1_vs_A1",
"a2_vs_A2",
"a3_vs_A3",
"a4_vs_A4",
"a5_vs_A5"
]
}
}
]
},
"direction" : "forward"
},
"rejectedPlans" : []
},
"serverInfo" : {
"host" : "mongodb446",
"port" : 27017,
"version" : "4.4.1",
"gitVersion" : "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1"
},
"ok" : 1.0
}

Example3.

Refer:MongoDB适用场景

Link:https://www.cnblogs.com/farwish/p/15379066.html

[MongoDB] aggregate 查询的优化思路的更多相关文章

  1. MySQL 查询语句优化思路

    query 语句的优化思路和原则主要提现在以下几个方面:1. 优化更需要优化的Query:2. 定位优化对象的性能瓶颈:3. 明确的优化目标:4. 从 Explain 入手:5. 多使用profile ...

  2. sql索引优化思路

    [开发]SQL优化思路(以oracle为例) powered by wanglifeng https://www.cnblogs.com/wanglifeng717 单表查询的优化思路 单表查询是最简 ...

  3. neo4j - 查询效率的几种优化思路

    最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...

  4. 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)

    注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...

  5. mysql优化思路

    /* mysql优化思路     1.数据库设计     2.sql语句优化     3.数据库参数设置     4.恰当的硬件资源和操作系统        数据库设计         数据的3NF( ...

  6. JAVA MONGODB group查询的UTC时间问题

    BasicDBList dateList = new BasicDBList(); dateList.add("$t"); dateList.add(28800000); DBOb ...

  7. Mongodb高级查询【二】

    上一篇文章,写了mongodb常规操作,继续写入,本章主要讲高级查询,文本,聚集,大数据查询. Mongodb的查询语法是很多的,是NOSQL队伍中比较丰富的一个.当然有很多查询跟关系型查询无法相比. ...

  8. mongodb集群性能优化

    mongodb集群性能优化 在前面两篇文章,我们介绍了如何去搭建mongodb集群,这篇文章我们将介绍如何去优化mongodb的各项配置,以达到最优的效果. 警告 不做任何的优化,集群搭建完成之后,使 ...

  9. PHP优化思路

    想起来记录一下自己对PHP的优化思路 针对Nginx和 PHP-FPM进行优化 首先应该分为代码层面.配置层面.架构层面 代码层面 参见了https://segmentfault.com/a/1190 ...

  10. MySQL order by的一个优化思路

    最近遇到一条SQL线上执行超过5s,这显然无法忍受了,必须要优化了. 首先看眼库表结构和SQL语句. CREATE TABLE `xxxxx` ( `id` ) NOT NULL AUTO_INCRE ...

随机推荐

  1. 瑞云科技联合飞蝶VR教育、大朋VR推出元宇宙 5G VR智慧教育整体解决方案

    近日,瑞云科技3DCAT实时渲染云与飞蝶VR.大朋VR达成深度合作.基于瑞云深度自研的实时渲染云技术.飞蝶VR教育内容资源的深厚积累以及大朋VR优秀的VR硬件产品力,三方针对元宇宙 5G VR智慧教育 ...

  2. Vulnhub靶场--EVILBOX: ONE

    环境配置 靶机连接 攻击者主机IP:192.168.47.130 目标主机IP:192.168.47.131 信息搜集 扫描目标主机,发现目标主机开放了22.80端口 ┌──(kali㉿kali)-[ ...

  3. KingbaseES flashback drop table

    KingbaseES 引入回收站功能,实现drop table操作的数据恢复.回收站功能默认关闭,参数名称:kdb_flashback.db_recyclebin.如果不允许一个删除的表进回收站,需要 ...

  4. 【已解决】Windows环境下redis启动失败

    在redis安装目录下打开cmd窗口: 依次输入: redis-cli.exe shutdown exit redis-server.exe redis.windows.conf ps:启动失败可能是 ...

  5. #KMP,矩阵乘法#洛谷 3193 [HNOI2008]GT考试

    题目 给定\(n,m,K\)和一个长度为\(m\)的数\(x\), 问有多少个\(n\)位数满足任意一段不与\(x\)完全相同,可含前导0 \(n\leq 10^9,m\leq 20\) 分析 设\( ...

  6. #线段树,二分#洛谷 2824 [HEOI2016/TJOI2016]排序

    题目 分析 这排序就很难实现,考虑定一个基准,小于该基准的视为0,否则视为1, 那排序可以看作将0和1分开,这就很好用线段树实现了 如果该位置是0,说明这个基准太高,显然可以用二分答案(基准),那么时 ...

  7. #阶梯NIM#Poj 1704 Georgia and Bob

    题目 有\(n\)个棋子摆放在x轴的正半轴上, 每次将棋子最多向左移动至上一个棋子之后(不能不移动), 不能操作为败,问先手是不是必胜 分析 这个模型可以转换成阶梯NIM的形式, 那么将奇数位置做NI ...

  8. 深入了解 Golang 条件语句:if、else、else if 和嵌套 if 的实用示例

    条件语句 用于根据不同的条件执行不同的操作.Go中的条件可以是真或假.Go支持数学中常见的比较运算符: 小于 < 小于等于 <= 大于 > 大于等于 >= 等于 == 不等于 ...

  9. Numpy数组变形和轴变换

    数组变形(reshape)或轴转换(Transposing Arrays and Swapping Axes)后返回的是非副本视图,对于非副本视图的修改会使原来的数组也同时改变. In [1]: im ...

  10. 基于tapd的git commit规范

    现状 开发团队中,总是有人提交代码时的commit内容乱写一通,或者不明确不完整.当回溯代码的时候,很难通过commit内容定位历史记录,只能一条一条查看,找不到就要去问历史参与开发的其他同事,沟通成 ...