Fazendo mais (e a parte mais difícil) do que você quer pode ser feito facilmente no MongoDB. A etapa final ao retornar "básico", "premium" ou "padrão" provavelmente também pode ser feita, mas acho que não vale a pena, pois isso é trivial em Go.
No MongoDB, use a estrutura de agregação por esta. Isso está disponível no
mgo
pacote via Collection.Pipe()
método. Você tem que passar uma fatia para ele, cada elemento corresponde a um estágio de agregação. Leia esta resposta para mais detalhes:Como obter um agregado de uma coleção do MongoDB
Voltando ao seu exemplo. Seu
GetEventLevel()
método poderia ser implementado assim:func (dao *campaignDAO) GetEventLevel(eventID string) (string, error) {
c := sess.DB("").C("eventboosts") // sess represents a MongoDB Session
now := time.Now()
pipe := c.Pipe([]bson.M{
{
"$match": bson.M{
"_event_id": eventID, // Boost for the specific event
"is_published": true, // Boost is active
"start_date": bson.M{"$lt": now}, // now is between start and end
"end_date": bson.M{"$gt": now}, // now is between start and end
},
},
{
"$lookup": bson.M{
"from": "campaigns",
"localField": "_campaign_id",
"foreignField": "_id",
"as": "campaign",
},
},
{"$unwind": "$campaign"},
{
"$match": bson.M{
"campaign.is_published": true, // Attached campaign is active
},
},
})
var result []*EventBoost
if err := pipe.All(&result); err != nil {
return "", err
}
if len(result) == 0 {
return "standard", nil
}
return result[0].Level, nil
}
Se você precisar de no máximo um
EventBoost
(ou pode não haver mais ao mesmo tempo), use $limit
stage para limitar os resultados a um único e use $project
para buscar apenas o level
campo e nada mais. Use este pipeline para a simplificação/otimização mencionada acima:
pipe := c.Pipe([]bson.M{
{
"$match": bson.M{
"_event_id": eventID, // Boost for the specific event
"is_published": true, // Boost is active
"start_date": bson.M{"$lt": now}, // now is between start and end
"end_date": bson.M{"$gt": now}, // now is between start and end
},
},
{
"$lookup": bson.M{
"from": "campaigns",
"localField": "_campaign_id",
"foreignField": "_id",
"as": "campaign",
},
},
{"$unwind": "$campaign"},
{
"$match": bson.M{
"campaign.is_published": true, // Attached campaign is active
},
},
{"$limit": 1}, // Fetch at most 1 result
{
"$project": bson.M{
"_id": 0, // We don't even need the EventBoost's ID
"level": "$level", // We do need the level and nothing more
},
},
})