MongoDB聚合$查找到作为索引数组的字段

时间:2018-01-15 20:48:07

标签: mongodb mongodb-query

我在涉及$lookup管道的两个集合上尝试相当复杂的聚合命令。只要在foreignField上设置索引,这通常适用于简单聚合。

但我的$lookup更复杂,因为索引字段不仅仅是普通的Int64字段,而且实际上是Int64的数组。在执行简单的find()时,可以使用explain()验证索引是否正在使用。但是解释聚合管道并不能解释是否在$lookup管道中使用了索引。我的所有时序测试似乎都表明索引没有被使用。 MongoDB版本是3.6.2。 Db兼容性设置为3.6。

正如我之前所说,我不使用简单的foreignField查询,而是使用特定于3.6的pipeline + $match + $expr ...

可以使用pipeline作为索引的showstopper吗?有没有人对新的$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"
     }
}])

1 个答案:

答案 0 :(得分:2)

这是一个缺少的功能,它将成为3.8版本的一部分。

目前,查找子流水线中的eq匹配已经过优化,可以使用索引。 请参阅3.7.1(开发版)中修复的jira

此外,this也可能与非多键索引相关。