Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Filtro dentro de um array de objetos

Olá, tenho o seguinte documento:

{
    "nome": "Nome Teste",
    "idioma": [
    {
        "idiomaID": 1,
        "idiomaNome": "Inglês",
        "nivel": 2,
        "nivelNome": "Intermediário"
    },
    {
        "idiomaID": 2,
        "idiomaNome": "Espanhol",
        "nivel": 3,
        "nivelNome": "Avançado"
    }]         
}

Preciso fazer um filtro por idioma onde o usuário informa o idioma desejado e seus níveis (pode ser mais de um nível para o mesmo idioma). E o resultado da busca precisa ser exatamente com o que foi informado, ou seja: se eu busquei uma pessoa com o idioma 1 e o nível 3, o resultado deveria ser NULL, pois não existe uma pessoa com o idioma 1 com o nível 3.

Porém o elasticsearch faz sempre a verificação com todos os objetos da lista e não estou conseguindo encontrar a solução para isso.

Tenho vários outros casos, devido meu sistema ser um SaaS, sempre vou precisar verificar pelo ID da Empresa e outro parâmetro em um array.

Qual seria a solução para esse problema?

Obrigado.

2 respostas
solução!

Oi Murilo,

Você vai precisar mudar o seu modelo já que o agrupamento que esta fazendo vai ser desfeito pelo elasticsearch na hora em que ele fizer o achatamento dos objetos aninhados. O seu documento esta ficando da seguinte maneira:

"idioma.idiomaID": [1, 2],
"idioma.idiomaNome": ["Inglês",  "Espanhol"]
...

Minha sugestão é você ter vários documentos para o mesmo nome, onde cada documento representa os agrupamentos que esta tentando fazer.

Referência: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html

Obrigado pela resposta Thadeu!

Usei o Nested e funcionou.

Abraços!