首先从业务角度出发,不必要的筛选条件和粗略的筛选条件会严重影响查询速度,比如 $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. TagProvider 与 Enricher 丰富日志

    TagProvider  [LogProperties] 与 [LogPropertyIgnore] 如果用在DTO不存在任何问题,如果用在Domain实体上,可能有点混乱. 您可能不希望因日志记录问 ...

  2. C#的播放资源文件里的音频例子 - 开源研究系列文章

    今天无聊,想起原来开发的待办列表TodoList里还缺个提醒声音,于是就添加了提供声音模块代码.然后想着记录一下,让更多的读者能够复用这个模块代码,于是就有了此博文.这个例子只是用于播放资源文件里的w ...

  3. C++ pieces

    standard lib fmax double fmax (double x, double y); float fmax (float x, float y); long double fmax ...

  4. 《Go程序设计语言》学习笔记之函数变量和匿名函数

    <Go程序设计语言>学习笔记之函数变量和匿名函数 一. 环境 Centos8.5, go1.17.5 linux/amd64 二. 函数变量 1. 概念 像其它的值一样,函数变量也有类型, ...

  5. koa2整合mysql

    引入mysql包 npm install mysql 封装mysql 创建mysql.js文件放在utils(工具包)中 使用pool连接池 mysql.js //封装mysql const mysq ...

  6. d3d12龙书阅读----绘制几何体(上)

    d3d12龙书阅读----绘制几何体(上) 本节主要介绍了构建一个简单的彩色立方体所需流程与重要的api 下面主要结合立方体代码分析本节相关知识 顶点 输入装配器阶段的输入 首先,我们需要定义立方体的 ...

  7. llama2+localGPT打造纯私有知识助手

    通过部署llama2系列,可以构建本地私有的知识小助手 用来输出一写周报.月报,甚至辅助数据分析都可以(想想都很轻松) 想要大模型支持特定的数据集,就需要进行专业的fine-turing 但是fine ...

  8. MyBatis的映射关系

    MyBatis的映射关系是有一个默认的,采用下划线命名的方式将数据库表的列名按照驼峰式映射成 Java 实体类的属性名 举个例子数据库表名为 tb_user,其中的字段名为 inst_code,对应的 ...

  9. #平衡树#洛谷 1110 [ZJOI2007]报表统计

    题目 分析 最小值只需要开两棵平衡树,一棵维护所有元素,一棵维护相邻最小值, 对于全局最小值,对于每次插入查找前驱后继更新最小值即可, 相邻最小值,对于每个原数列的数维护它的开头和结尾是什么数, 然后 ...

  10. 使用OHOS SDK构建benchmark

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/google/bench ...