当前位置: 首页 > 知识库问答 >
问题:

MongoDB$查找管道:这是否使用索引?

司寇研
2023-03-14

我有一个查询,它利用了$lookup的管道功能,还使用了$expr。嗯,这很有效,但性能不太好。它在一个包含约4000个文档的集合中查找内容,并连接其他两个集合(使用$查找块)。运行大约需要2000ms,即使每个集合中只有几千个文档。

查询如下所示:

            {
                $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..

                                    ]
                                }
                            }
                        }
                    ]

在此上运行explain()仅提供有关第一个$匹配块的信息。但如何确定管道中的$expr是否使用索引?

我尝试向管道中使用的所有字段添加索引,还尝试创建一个复合索引,但我无法加快速度。

如何提高性能?

我的查询结构:

match (filter by language),
lookup (col1 join)
lookup (col2 join)
project,
sort

我正在使用Mongo 4.0

编辑:

实际上,管道中的操作是否可以使用索引?我听说只有$eq可以使用索引,其他操作不能。这是真的吗???

提前感谢!

共有2个答案

严宏旷
2023-03-14
{$lookup:
 {
   from: <collection to join>,
   localField: <field from the input documents>,
   foreignField: <field from the documents of the "from" collection>,
   as: <output array field>
 }
}
章高朗
2023-03-14

它应该是,但已经报告(并修复)了一些与此相关的错误:

https://jira.mongodb.org/browse/SERVER-31760

确保您使用的是最新版本和实验。

 类似资料:
  • 我有一个引用另一个文档的文档,我想加入这些文档并根据子文档中数组的内容进行筛选: deployment\u计算机文档: machine\u状态文档: 我使用的是Mongo 3.6,在查找和管道方面取得了一些成功,下面是我在python MongoEngine中使用的对象,它被传递给聚合函数: 这工作得很好,但是我怎么能排除部署机器不活动的结果呢?我觉得它必须进入项目,但找不到有效的条件。感谢任何帮

  • 问题内容: 我是Node.js和Heroku的新手,我构建了一个使用node.js并从mongodb实例检索一些数据的小应用程序。我设置了整个程序,但是我的问题是我认为mongodb的语法很简单。 我需要在启动应用程序时知道我的收藏夹中是否包含任何东西,如果没有,则不进行初始化。我尝试调用collection.count(),但返回未定义。 我尝试这样做 任何帮助表示赞赏。 问题答案: 任何访问数

  • 问题内容: 我正在使用SQL Server,但没有足够的数据集来测试查询的性能。 我想分析查询,看看索引是否被利用。我该如何检查 问题答案: 在SQL Management Studio中,只需键入查询,然后按Control-L(显示查询执行计划)。在那里,您将能够查看是否正在使用任何索引。“表扫描”表示未使用索引。“索引扫描”是指使用索引。

  • 传递参数 链接管道 我们可以将多个管道连接在一起,以便在一个表达式中使用多个管道。

  • 问题内容: 我有一个LinkedHashMap。我想让Foo的索引为N。除了迭代直到找到它,还有更好的方法吗?: 对于某些操作,我必须通过约50次的索引从映射中获取随机元素。该地图将包含大约20个项目。 谢谢 问题答案: 然后对于带有O(1)的索引N …

  • 这种方法在确定树是否为BST时是错误的吗?节点的左子树仅包含键小于节点键的节点。节点的右子树仅包含键大于节点键的节点。左右子树也必须是二叉搜索树。我的代码是: