MongoDB聚合$lookup到一个索引数组字段

4
我正在尝试在两个集合上使用相当复杂的聚合命令,涉及到$lookup管道。只要在foreignField上设置了索引,这通常在简单的聚合中就可以正常工作。但是我的$lookup更加复杂,因为索引字段不仅是普通的Int64字段,而且实际上是一个Int64数组。在执行简单的find()时,可以通过使用explain()轻松验证索引是否被使用。但是解释聚合管道并没有解释$lookup管道中的索引是否被使用。所有的时间测试似乎都表明索引没有被使用。MongoDB版本为3.6.2。数据库兼容性设置为3.6。
正如我之前所说,我没有使用简单的foreignField查找,而是使用了特定于3.6的pipeline + $match + $expr...
使用pipeline可能会成为索引使用的障碍吗?有没有人对新的$lookup管道语法和/或数组字段上的索引有深入的经验?
以下任何一种方式都可以正常工作,并且如果进行解释,会显示followers上的索引正在被使用。
db.col1.find({followers: {$eq : 823778}})
db.col1.find({followers: {$in : [823778]}})

但是接下来的这个似乎没有利用followers上的索引[管道中还有更多步骤,为了可读性已省略]。

db.col2.aggregate([
    {$match:{field: "123"}},
    {$lookup:{
       from: "col1",
       let : {follower : "$follower"},
       pipeline: [{
            $match: {
                $expr: {
                    $or: [
                        { $eq : ["$follower", "$$follower"] },                       
                        { $in : ["$$follower", "$followers"]}
                       ]
                }                        
            }
        }],
       as: "followers_all"
     }
}])

你有找到任何相关的东西吗?我已经在3.7.1(开发版本)中发现了Jira修复。你能否更新一下并查看它是否有效?这个也可能与此相关。 - s7vr
好的,我最终改变了我的数据库结构,这样我就不必使用这个复杂的查找了。我非常不愿意在生产数据库上使用任何开发人员构建。我想我将不得不等待下一个更新周期。 - wpfwannabe
哦不。我从来没有想过让你在生产环境中使用开发版本。我只是想知道当生产版本可用时,你是否会验证并使用它。 - s7vr
我绝对会使用它。但是在下一个更新之前还要等一段时间。顺便说一下,您似乎已经回答了我的问题,考虑到这可能是一个漏洞或缺失的功能。如果您将其制定为答案,我将很高兴地标记它。谢谢! - wpfwannabe
1个回答

2

这是一个缺失的功能,将在3.8版本中实现。

目前,在查找子管道中,eq匹配已经优化为使用索引。请参考jira,该问题已在3.7.1(开发版本)中修复。

此外,这个问题也可能与非多键索引有关。


你好,能否请您提供一个链接,说明这个改进将成为3.8的一部分?我似乎找不到任何关于这个改进的信息。 - mdewit
@medewit提到的问题已经被反向移植到3.6(3.6.3)版本中。因此,它应该在最新的Mongo版本中可用。 - s7vr
感谢您的回复,我目前在使用$gte时遇到了相同的问题(与仅使用$eq相比)。我已经在MongoDB邮件列表上发布了我的(类似的)问题。 - mdewit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接