如何在动态查询生成的字段上使用索引。假设我有 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 个查询参数,我需要使用所有可能的单索引和复合索引吗?
在这部分中,您将匹配将文档中的字段作为输入的表达式的结果:
{
"$expr": {
"$anyElementTrue": {
"$map": {
"input": "$PreferredCategory",
"as": "y",
"in": {
"$eq": [
{
"$toString": "$$y._id"
},
"-1"
]
}
}
}
}
},
查询引擎不会尝试推理其真正含义,因此会将其视为生成值,无法通过索引提供服务。
作为人类,我们可以推断,为了使字符串表示形式为“-1”,输入必须已经是字符串“-1”或数字值 -1 作为整数、浮点数、双精度数等。
结合 MongoDB 处理数组查询的方式,这允许不同的等效表示法:
"PreferredCategory._id": {$in: [ "-1",-1] }