MongoDB $lookup 管道 : does this use indexes?

标签 mongodb join aggregate pipeline

我有一个使用 $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/

相关文章:

mysql - 我有 2 个查询,只有一个区别,我想合并到一个查询中

r - 在 R 数据框中,如何广播与维度相对应的列?

r - 聚合具有共享值的行,同时在单独的列中选择值以保留在聚合行中

r - 如何以季度频率汇总 data.table?

javascript - 取决于 mongoose pre ('update' 中的查询更改文档)

mysql - 保持动态数据库字段的最佳方式?

mysql - SQL不同的连接和WHERE子句可能会出错

json - 加入 Apache Pig

mongodb - 如何为 Logstash 提供 MongoDB 类型的输入

mongodb - 增加 mongodb 聚合作业的内存限制