Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongo DB集合扫描或索引扫描_Mongodb_Match_Aggregation - Fatal编程技术网

Mongodb Mongo DB集合扫描或索引扫描

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:

我有一个关于“收集时间”的索引。存在一个问题,即在显示索引扫描时,正在扫描使用相同字段显示集合的一个查询。以下是我在下面发布的聚合管道中的“$match”步骤。有人能帮我解释一下什么是问题,我该如何处理

若我在管道中有以下$match步骤,它将作为索引扫描进行计算

{
   "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",
                        ]
                    }
                ]
            }
        }