如何在聚合管道中对 MongoDB 动态生成的查询进行索引?

问题描述 投票:0回答:1

如何在动态查询生成的字段上使用索引。假设我有 20 个查询参数。我们可以使用单个参数或多个参数进行搜索。如果它是单个参数,我可以只在该数据库字段上使用索引。但是如果使用多个查询参数进行搜索呢?我的聚合查询是从 c# Linqkit 构建的,我确实从查询分析器中检查了它以识别慢速查询。

{
  "type": "command",
  "ns": "UserCollection",
  "command": {
    "aggregate": "UserCollection",
    "pipeline": [
      {
        "$match": {
          "$and": [
            {
              "PreferredCategory": {
                "$ne": null
              }
            },
            {
              "$expr": {
                "$anyElementTrue": {
                  "$map": {
                    "input": "$PreferredCategory",
                    "as": "y",
                    "in": {
                      "$eq": [
                        {
                          "$toString": "$$y._id"
                        },
                        "-1"
                      ]
                    }
                  }
                }
              }
            },
            {
              "AcademicQualifications": {
                "$ne": null
              }
            },
            {
              "AcademicQualifications": {
                "$elemMatch": {
                  "IsForeigner": false
                }
              }
            }
          ]
        }
      },
      {
        "$project": {
          "_id": "$_id",
          "UpdatedOn": "$UpdatedOn",
          "Id": "$Id",
          "Address": "$Address",
          "Name": "$Name",
        
        }
      },
      {
        "$sort": {
          "Id": 1
        }
      },
      {
        "$skip": 0
      },
      {
        "$limit": 25
      }
    ],
    "cursor": {},

    "$clusterTime": {
      "clusterTime": {
        "$timestamp": {
          "t": 1718085612,
          "i": 3
        }
      },
     
  "planSummary": "COLLSCAN",
  "keysExamined": 0,
  "docsExamined": 5213428,
  "hasSortStage": true,
  "cursorExhausted": true,
  "numYields": 23701,
  "nreturned": 0,
  "queryHash": "FB6AE820",
  "planCacheKey": "8A0D99CD",
  "queryFramework": "classic",
  "reslen": 246,
  "locks": {
    "FeatureCompatibilityVersion": {
      "acquireCount": {
        "r": 23703
      }
    },
    "Global": {
      "acquireCount": {
        "r": 23703
      }
    },
    "Mutex": {
      "acquireCount": {
        "r": 2
      }
    }
  },
  "readConcern": {
    "level": "local",
    "provenance": "implicitDefault"
  },
  "writeConcern": {
    "w": "majority",
    "wtimeout": 0,
    "provenance": "implicitDefault"
  },
  "storage": {
    "data": {
      "bytesRead": 24247394382,
      "timeReadingMicros": 181767420
    },
    "timeWaitingMicros": {
      "cache": 47581
    }
  },

  "protocol": "op_msg",
  "durationMillis": 322465,

  "isTruncated": false
}

正在生成此查询,并且需要很长时间。我确实在 Id 上使用了索引,但它没有被使用。那么,既然可以动态查询,那么如何建立索引呢?由于有 20 个查询参数,我需要使用所有可能的单索引和复合索引吗?

mongodb indexing aggregation-framework asp.net-core-webapi linqkit
1个回答
0
投票

在这部分中,您将匹配将文档中的字段作为输入的表达式的结果:

{
              "$expr": {
                "$anyElementTrue": {
                  "$map": {
                    "input": "$PreferredCategory",
                    "as": "y",
                    "in": {
                      "$eq": [
                        {
                          "$toString": "$$y._id"
                        },
                        "-1"
                      ]
                    }
                  }
                }
              }
            },

查询引擎不会尝试推理其真正含义,因此会将其视为生成值,无法通过索引提供服务。

作为人类,我们可以推断,为了使字符串表示形式为“-1”,输入必须已经是字符串“-1”或数字值 -1 作为整数、浮点数、双精度数等。

结合 MongoDB 处理数组查询的方式,这允许不同的等效表示法:

"PreferredCategory._id": {$in: [ "-1",-1] }

示例:https://mongoplayground.net/p/odNGaB9OAc1

© www.soinside.com 2019 - 2024. All rights reserved.