Пн go фильтровать документы по массиву объектов - PullRequest
0 голосов
/ 27 мая 2020

Мне нужно отфильтровать документы-кандидаты по массиву объектов.

В документах у меня есть следующие поля:

skills = [
  { _id: 'blablabla', skill: 'Angular', level: 3 },
  { _id: 'blablabla', skill: 'React', level: 2 },
  { _id: 'blablabla', skill: 'Vue', level: 4 },
];

Когда я делаю запрос, я получаю другой набор навыков , например:

skills = [
  { skill: 'React', level: 2 },
];

Итак, мне нужно создать запрос, чтобы получить документы, содержащие этот навык и более высокий или равный уровень.

Я пытаюсь сделать следующее:

const conditions = {
  $elemMatch: {
    skill: { $in: skills.map(item => item.skill) },
    level: { $gte: { $in: skills.map(item => item.level) } }
  }
};

Candidate.find(conditions)...

Первый вроде работает, а второй не работает.

Есть идеи?

Заранее спасибо!

1 Ответ

1 голос
/ 27 мая 2020

С этим запросом так много проблем ...

Прежде всего 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 }
        } } }
    ))
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...