Mongodb Mongo DB集合扫描或索引扫描
我有一个关于“收集时间”的索引。存在一个问题,即在显示索引扫描时,正在扫描使用相同字段显示集合的一个查询。以下是我在下面发布的聚合管道中的“$match”步骤。有人能帮我解释一下什么是问题,我该如何处理 若我在管道中有以下$match步骤,它将作为索引扫描进行计算Mongodb Mongo DB集合扫描或索引扫描,mongodb,match,aggregation,Mongodb,Match,Aggregation,我有一个关于“收集时间”的索引。存在一个问题,即在显示索引扫描时,正在扫描使用相同字段显示集合的一个查询。以下是我在下面发布的聚合管道中的“$match”步骤。有人能帮我解释一下什么是问题,我该如何处理 若我在管道中有以下$match步骤,它将作为索引扫描进行计算 { "timeofcollection":{$gte:ISODate("2020-09-24T00:00:00.000+0000"),$lt:ISODate('2020-09-25T00:
{
"timeofcollection":{$gte:ISODate("2020-09-24T00:00:00.000+0000"),$lt:ISODate('2020-09-25T00:00:00.000+0000')}
}
若我在管道中有以下步骤,它将作为集合扫描进行计算
{
基本上,我想做的是提取最后一天的记录。这很好,但涉及到收集扫描,我做不到
有什么帮助吗?这可能不是一个完整的答案,但我看到您上面的聚合有一个明显的问题,那就是,出于某种原因,您似乎正在将日期转换为文本,而只是再次将其转换回日期。通常,如果您的筛选器包含一个函数
收集时间
,则收集时间上的索引
可能不可用。请尝试此版本:
$match: {
"$expr": {
"$and": [
{
"$gte": [
"$_id.dt",
{
"$subtract": [ "$$NOW", 86400000 ]
}
],
},
{
"$lt": [
"$_id.dt", "$$NOW",
]
}
]
}
}
注意,我在这里假设上述片段中的dt
是timeofcollection
的别名,在前面的某个地方定义
这里的关键点是,在函数中使用
timeofcollection
可能会导致索引不可用。上述版本可能会解决此问题。使用运算符时,查询计划器将仅使用索引进行等式比较
它还将仅在表达式的值对于查询为常量时使用索引。由于
$$NOW
变量在查询执行开始之前不会绑定,并且每次执行都会有不同的值,因此查询计划器不会对使用该变量的查询使用索引。你认为收集会在这个日期范围内吗?@TimBiegeleisen大约6%到7%。每天有将近7到8条Lac记录。你应该对查询运行explainStats
,看看Mongo是如何计划的。@TimBiegeleisen explainStats正在显示上述查询的收集扫描。我尝试了json,但仍然是收集扫描。M可能您的json在expr中也有收集时间,导致它成为收集扫描。
$match: {
"$expr": {
"$and": [
{
"$gte": [
"$_id.dt",
{
"$subtract": [ "$$NOW", 86400000 ]
}
],
},
{
"$lt": [
"$_id.dt", "$$NOW",
]
}
]
}
}