gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:13:57 27 4
gpt4 key购买 nike

我正在对涉及 $lookup 管道的两个集合尝试相当复杂的聚合命令。只要在 foreignField 上设置索引,这通常在简单聚合上工作得很好。

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

正如我之前所说,我没有使用简单的 foreignField 查找,而是使用 3.6 特定的 pipeline + $match + $表达式...

使用 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.8 版本中缺少的功能。

目前查找子管道中的 eq 匹配已优化为使用索引。引用jira在 3.7.1(开发版)中修复。

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

关于MongoDB 聚合 $lookup 到作为索引数组的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com