1
resposta

Dúvidas sobre aggregation com Go e Mongodb

Olá, estou tentando fazer uma pesquisa com aggregation usando varios estagios, mas está me retornando erro 500. Minha query a princípio esta certa, mas nao sei se estou utilizando corretamente o drive. Insira aqui a descrição dessa imagem para ajudar na acessibilidadeAlguém consegue me ajudar? São duas funções. Basicamente, na funcao 1, eu estou dando um match por index, dando um replaceroot no obejeto com o lenguage que passei e pegando o objeto labels dentro dele. na na Função 2 eu aplico os filtros.

Função 1:

func ReadLabels(index int, language string) models.Label {
    ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
    var label models.Label

    matchStage := bson.D{{"$match", bson.D{{"index", index}}}}
    replaceRootStages := bson.D{{"$replaceRoot", bson.D{{"labels", language}}}}
    projectStage := bson.D{{"$project", bson.D{{"limits", 0}}}}

    pipeline := mongo.Pipeline{matchStage, replaceRootStages, projectStage}

    answer, err := database.AnalyteCollection().Aggregate(ctx, pipeline, &options.AggregateOptions{})

    if err = answer.All(ctx, &label); err != nil {
        panic(err)
    }

    return label
}

Função 2:

func ReadLimits(index, age int, language, sex string) models.Limits {
    ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
    var limits models.Limits

    matchStage := bson.D{{"$match", limits.Index == index}}
    replaceRootStages := bson.D{{"$replaceRoot", bson.D{{"labels" + ".", language}}}}
    unwindStage := bson.D{{"$unwind", "$use"}}
    match2Stage := bson.D{{"$match", bson.D{{"limits.sex", sex}, {"limits.min_age", age}, {"limits.max_age", age}}}}
    sortStage := bson.D{{"$sort", bson.D{{"rating", 1}, {"limits.index", 1}}}, {"$sort", bson.D{{"rating", 1}, {"limits.index", 1}}}}
    groupStage := bson.D{{"$group", bson.D{{"_id", "$limits"}}}}

    pipeline := mongo.Pipeline{matchStage, replaceRootStages, unwindStage, match2Stage, sortStage, groupStage}

    answer, err := database.AnalyteCollection().Aggregate(ctx, pipeline, &options.AggregateOptions{})

    if err = answer.All(ctx, &limits); err != nil {
        panic(err)
    }

    return limits
}
1 resposta

Olá Carlos!

Pelo que pude analisar, o erro 500 que você está recebendo pode estar relacionado ao uso incorreto do driver do MongoDB ou à estrutura da sua query de agregação.

Na função 1, percebi que você está utilizando o estágio $replaceRoot de forma incorreta. O segundo parâmetro desse estágio deve ser um objeto que representa o novo documento raiz, mas você está passando apenas a string language. Para corrigir isso, você pode criar um novo objeto bson.D com a chave "labels" e o valor sendo a string language. Ficaria assim:

replaceRootStages := bson.D{{"$replaceRoot", bson.D{{"newRoot", bson.D{{"labels", language}}}}}}

Na função 2, também encontrei alguns problemas na estrutura da query. No estágio $match, você está comparando limits.Index com index, mas acredito que a intenção seja comparar apenas os valores. Para corrigir isso, você pode utilizar o operador $eq dentro do estágio $match. Ficaria assim:

matchStage := bson.D{{"$match", bson.D{{"limits.Index", bson.D{{"$eq", index}}}}}}

Além disso, notei que você está utilizando dois estágios $sort com as mesmas chaves. Você pode combinar esses dois estágios em um único estágio $sort. Ficaria assim:

sortStage := bson.D{{"$sort", bson.D{{"rating", 1}, {"limits.index", 1}}}}

Após realizar essas correções, tente executar novamente suas funções e veja se o erro 500 persiste. Lembre-se também de verificar se o driver do MongoDB está configurado corretamente em seu projeto.

Espero ter ajudado! Bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software