Tenho uma coleção no mongo (go) cujo tipo é:
type CreateFeedbackRequest struct {
UserID string `json:"user_id" validate:"required"`
WaybillID uint64 `json:"waybill_id" validate:"required"`
Rating int `json:"rating" validate:"required"`
Comment string `json:"comment"`
ReceivedAt time.Time `json:"received_at" validate:"required"`
}
Preciso avaliar o valor mediano da classificação dos últimos 5 registros (por receivedAt
campo de tempo) para determinado usuário (por seu user_id
). Eu já consegui isso:
matchStage := bson.D{{"$match", bson.D{{"_id", userID}}}}
sortStage := bson.D{{"$sort", bson.D{{"created_at", 1}}}}
limitStage := bson.D{{"$limit", tripsCount}}
cursor, err := r.c.Aggregate(ctx, mongo.Pipeline{matchStage, sortStage, limitStage})
Mas não sei como obter a mediana de classificação para essas 5 linhas. E não tenho certeza sobre a maneira correta de fazer isso. Ajuda, obrigado
Após o
$limit
estágio, uma opção desde o mongodb versão 7.0 é$group
com$median
acumuladorPara versões mais antigas, você pode
$sort
porrating
$group
e$push
todosrating
s para uma matriz (todos os 5 após o limite)$project
o item no meio da matrizSerá assim: