6
respostas

[Bug] Multiply e Divide dando erro na execução

Boa tarde. Quando eu fiz o exercício do "$divide" e do "$multiply", retorna um erro de que as expressões suportam apenas tipos numéricos. Refiz várias vezes, e o erro sempre é o mesmo. Sabem me informar onde estou errando? Segue as consultas:

Divide:

db.contas.aggregate([
    {
        $project:{
            _id:0,
            valor:1,
            dividido:{
                $divide: ["$valor", 2]
            }
        }
    }
])

multiply:

db.contas.aggregate([
    {
        $project:{
            _id:0,
            valor:1,
            multiplicado:{
                $multiply:["$valor", 2]
            }
        }
    }
])

No aguardo. Obrigado!

6 respostas

Olá, Silvanio, tudo bem?

  • Você poderia verificar qual é o tipo do seu campo valor?

Pelo erro retornado, ele informa que este campo não é numérico, ou seja, pode estar com tipo de texto ou com algum valor em outro formato.

Aguardo o seu retorno!

Olá Danielle, O campo "valor" está como "double":

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Segue a imagem do erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

No MongoDB podemos ter em uma mesma coleção, documentos com os tipos de campos diferentes. Então Silvanio, isto pode estar acontecendo no seu caso. Dentro da sua coleção de contas, algum documento está com o tipo do campo valor diferente.

Isso pode estar acontecendo, pois o MongoDB define os tipos dos campos automaticamente quando não fazemos isso(utilizando o jsonSchema, por exemplo.)

Temos algumas formas de resolver este problema:

  • Tentar identificar quais documentos estão com o tipo do campo diferente e ajusta-los.
  • Ou, no momento de executar o comando, realizar a conversão dos valores presentes no campo utilizando o $toDouble, dessa forma:
db.contas.aggregate([
    {
        $project:{
            _id:0,
            valor:1,
            multiplicado:{
                $multiply:[{$toDouble:"$valor"}, 2]
            }
        }
    }
])

Boa tarde!

Acho que vc como eu, que fez outros cursos seguidos, deve ter incluído um documento com o valor "errado". O que funcionou para mim, foi o primeiro ponto da Danielle de identificar os registros que estão como string e corrigí-los.

Para achar as contas que estão com o valor em string, executei o código abaixo:

db.contas.aggregate({$sort:{valor:1}})

E os primeiros registros serão os que estão "errados". Ao conseguir consultar esses documentos, pegue o id deles. Com o id em mãos, executei o código abaixo:

db.contas.updateMany(
    {_id:{$in:[120, 154, 211]}}, 
    {$set:{valor:0.0}
    })

E após atualizar os valores, executei o código da aula e funcionou.

Obs.: Tentei procurar os valores "errados" com $exists:false, $type:10 e etc, mas nenhum me retornava valor algum.. Assim como foi solicitado em um desafio anterior (do qual postei a dúvida já), ao utilizar o comando $exists:false não me retornava nada.

Espero que funcione para você Silvanio. Obrigado!!

Realmente os três primeiros registro do arquivo de contas disponibilizado no inicio do treinamento e com os ids: 120, 154, 211 estão sem a informação do valor, fez com que ao importar ficassem como string vazia no banco.

Com a atualização deles funcionou.

Obrigado pela ajuda pessoal