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