我试图在聚合中的 $search 之后使用 $skip 和 $limit 。每次当我尝试增加跳过大小时,执行时间都会变长
示例:
我的代码:
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 搜索索引中指定升序或降序。
当您跳过“x”个文档时,这些文档仍会读入内存,因此您会看到查询时间随着跳过计数的增加而增加。只是跳过的文件不会返回给司机。 推荐的优化方法是寻找可以实现基于过滤器的分页的方法,例如基于时间戳的过滤(每页获取 7 天的文档或每页 1 个月的文档)等,而不是跳过整个批次。只需确保索引支持此基于过滤器的分页产生的查询即可。
假设您的文档很大。您可以使用此标志 (
returnStoredSource: true
) 来提高查询性能。但首先您需要定义存储源字段图集搜索索引。这样,您的 $search
阶段将返回精简后的数据(它只会返回 Stored Source 中定义的字段,默认情况下包括 _id
。之后您可以执行 $skip
和 $limit
阶段,最后执行 $lookup
获取与精简文档关联的所有字段。您的聚合将如下所示:
$search
$skip
$limit
$lookup
$unwind
$replaceRoot