在Atlas搜索中使用skip和limit时的查询优化

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

我试图在聚合中的 $search 之后使用 $skip 和 $limit 。每次当我尝试增加跳过大小时,执行时间都会变长

示例:

  • 跳过10并限制10则执行时间为500ms
  • 跳过30并限制10则执行时间为700ms
  • 跳过50并限制10则执行时间为900ms
  • 跳过800并限制10则执行时间为20秒

我的代码:

db.collection.aggregate([
    {
        $search: {
            "index": 'search',
            "count": { "type": "total" },
            "compound": {
                "must": [{
                    "range": {
                        "path": "timestamp",
                        "gte": ISODate('2020-01-01'),
                        "lte": ISODate()
                    }
                },
                {
                    "text": {
                        "query": '(.*)info(.*)',
                        "path": ['field1', 'field2']
                    },
                },
                {
                    "near": {
                        "path": 'timestamp',
                        "origin": ISODate(),
                        "pivot": 7776000000
                    }
                }
                ],
            }
        }
    },
    { $skip: 10 },
    { $limit: 10 }
])

我需要知道是否有其他方法可以优化查询以加快速度,以及是否有任何方法可以在 Atlas 搜索索引中指定升序或降序。

mongodb mongodb-query aggregation mongodb-atlas mongodb-atlas-search
2个回答
0
投票

当您跳过“x”个文档时,这些文档仍会读入内存,因此您会看到查询时间随着跳过计数的增加而增加。只是跳过的文件不会返回给司机。 推荐的优化方法是寻找可以实现基于过滤器的分页的方法,例如基于时间戳的过滤(每页获取 7 天的文档或每页 1 个月的文档)等,而不是跳过整个批次。只需确保索引支持此基于过滤器的分页产生的查询即可。


0
投票

假设您的文档很大。您可以使用此标志 (

returnStoredSource: true
) 来提高查询性能。但首先您需要定义存储源字段图集搜索索引。这样,您的
$search
阶段将返回精简后的数据(它只会返回 Stored Source 中定义的字段,默认情况下包括
_id
。之后您可以执行
$skip
 $limit
阶段,最后执行
$lookup
获取与精简文档关联的所有字段。您的聚合将如下所示:

  1. $search
  2. $skip
  3. $limit
  4. $lookup
  5. $unwind
  6. $replaceRoot
© www.soinside.com 2019 - 2024. All rights reserved.