【发布时间】:2021-03-24 11:17:17
【问题描述】:
我有一个给定的 MongoDb 集合,其中包含与此类似的文档:
{
items: [
{ id: 1, data: 'a' },
{ id: 2, data: 'b' },
{ id: 3, data: 'c' },
]
}
现在我必须从这个集合中$lookup。我需要来自 id = 2 元素的数组数据,其中 id = 1 数据与查找值 $$value 匹配。我第一次天真地尝试找到正确的文档如下所示:
$match {
items: { $elemMatch: {
id: 1,
data: '$$value'
} }
}
但是 $$value 没有被评估,所以数据与文字而不是它的值进行比较。我还尝试使用$expr 评估该值,但我无法获得正确的语法(如果可能的话?)。
我能够开始工作的唯一工作方式是先提取数据,然后进行匹配:
[
{
$project: {
_id: 0,
data1: {
$filter: {
input: '$items', as: 'item',
cond: {$eq: ['$$item.id', 1]}
}
},
data2: {
$filter: {
input: '$items', as: 'item',
cond: {$eq: ['$$item.id', 2]}
}
},
}
},
{
$set: {
data1: {$arrayElemAt: ['$data1.data', 0]},
data2: {$arrayElemAt: ['$data2.data', 0]}
}
},
{
$match: {
$expr: {$eq: ['$data1', '$$value']}
}
}
];
但正如人们所预料的那样,这种方法要慢得多。对于涉及的数据,查询需要 7 秒,而上层方法(使用常量而不是变量 $$value)快 3 倍以上。
是否可以在$elemMatch 运算符中直接使用变量$$value?或者是否有任何其他优化可用于加速集合查找?
【问题讨论】:
标签: mongodb query-optimization