我在涉及$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"
}
}])