С этим запросом так много проблем ...
Прежде всего item.tech
- это должно быть item.skill
.
Далее, $ gte ... $ in имеет очень мало смысла. $ gte означает >=
, больше или равно чему-то. Если вы сравниваете числа, «что-то» должно быть числом. Подобно 3> = 5 преобразуется в false
, а 3> = 1 преобразуется в true
. 3> = [1,2,3,4,5] не имеет смысла, поскольку он разрешается в true
в первые 3 элемента и в false
в последние 2.
Наконец, $ elemMatch так не работает. Он проверяет каждый элемент массива на соответствие всем условиям. То, что вы пытались написать, было похоже на: найдите документ, в котором массив навыков имеет вложенный документ с навыком, совпадающим по крайней мере с одним из [массив навыков], а уровень больше чем ... что-то. Даже если условие $ gte было правильным, комбинация $ elementMatch и $ in внутри не работает лучше, чем обычный $ in:
{
skill: { $in: skills.map(item => item.tech) },
level: { $gte: ??? }
}
Если вы хотите найти кандидатов с техническими навыками определенного уровня или выше, это должно быть $ или условие для каждой пары уровней навыков:
const conditions = {$or:
skills.map(s=>(
{skill: { $elemMatch: {
skill:s.skill,
level:{ $gte:s.level }
} } }
))
};