我有一个使用 $lookup 的管道功能的查询,它也使用 $expr。
嗯,它有效,但性能不是很好。它在一个包含大约 4000 个文档的集合中查找内容并加入其他 2 个集合(使用 $lookup 块)。
尽管每个集合中只有几千个文档,但运行时间大约需要 2000 毫秒。
查询如下所示:
{
$match: {
language: 'str'
}
},
{
$lookup: {
from: 'somecollection',
let: { someId: '$someId' },
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
'$_id',
'$$someId'
]
},
{
$gte: ['$field',value]
},
{
$lte: ['$field2',value]
}
....
// some more conditions..
]
}
}
}
]
对此运行解释()仅提供有关第一个 $match 块的信息。但是如何确定管道中的 $expr 是否正在使用索引?
我尝试为管道中使用的所有字段添加索引,我还尝试创建复合索引,但我无法让它更快。
我怎样才能提高性能?
我的查询结构:
match (filter by language),
lookup (col1 join)
lookup (col2 join)
project,
sort
我正在使用 Mongo 4.0
编辑:
实际上,管道中的操作是否可以使用索引?我听说只有 $eq 能够使用索引,其他操作不能。这是真的???
提前致谢!
最佳答案
它应该是,但有一些错误报告(和修复)与此相关:
https://jira.mongodb.org/browse/SERVER-31760
确保您使用的是最新版本并进行实验。
关于MongoDB $lookup 管道 : does this use indexes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60496967/