1
resposta

Duvida sobre aggregate com Go e Mongodb

Olá, estou tentando fazer uma pesquisa com aggregation usando vatios 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! Parece que você está enfrentando um problema ao utilizar a agregação com Go e MongoDB. Analisando o código que você compartilhou, notei que há alguns pontos que podem estar causando o erro 500.

Na função 1, você está utilizando o estágio $replaceRoot para substituir o objeto raiz pelo objeto labels com base no idioma fornecido. No entanto, o código parece estar passando o idioma diretamente como uma string, em vez de usar o campo language que você recebe como parâmetro. Para corrigir isso, você pode modificar a linha replaceRootStages := bson.D{{"$replaceRoot", bson.D{{"labels", language}}}} para replaceRootStages := bson.D{{"$replaceRoot", bson.D{{"labels", "$" + language}}}}. Dessa forma, o idioma será interpretado como um campo e não como uma string.

Na função 2, você está utilizando o estágio $match para filtrar os resultados com base nos valores dos campos limits.Index, limits.sex, limits.min_age e limits.max_age. No entanto, a forma como você está passando esses valores para o estágio $match pode estar causando o erro. Em vez de utilizar a sintaxe limits.Index == index, você pode modificar a linha matchStage := bson.D{{"$match", limits.Index == index}} para matchStage := bson.D{{"$match", bson.D{{"limits.Index", index}}}}. Repita esse padrão para os outros campos também.

Lembre-se de que essas são apenas sugestões com base no código que você compartilhou. Pode haver outros problemas em seu código que não foram mencionados aqui. Certifique-se de verificar a documentação do driver do MongoDB para Go e também os logs de erro para obter mais informações sobre o erro 500 que você está enfrentando.

Espero ter ajudado e bons estudos!