Làm hầu hết (và phần khó nhất) những gì bạn muốn có thể dễ dàng thực hiện trong MongoDB. Bước cuối cùng khi trả về "cơ bản", "cao cấp" hoặc "tiêu chuẩn" rất có thể cũng có thể được thực hiện, nhưng tôi nghĩ rằng nó không đáng phải phức tạp vì điều đó là nhỏ trong cờ vây.
Trong MongoDB, hãy sử dụng Khung tổng hợp
cho điều này. Điều này có sẵn trong mgo
gói qua Collection.Pipe()
phương pháp. Bạn phải chuyển một lát cho nó, mỗi phần tử tương ứng với một giai đoạn tổng hợp. Đọc câu trả lời này để biết thêm chi tiết: Cách Nhận Tổng hợp từ Bộ sưu tập MongoDB
Quay lại ví dụ của bạn. GetEventLevel()
của bạn phương pháp có thể được triển khai như thế này:
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
}
Nếu bạn chỉ cần nhiều nhất một EventBoost
(hoặc có thể không có nhiều hơn cùng một lúc), hãy sử dụng $limit
để giới hạn kết quả cho một kết quả duy nhất và sử dụng $project
để chỉ tìm nạp level
trường và không có gì khác.
Sử dụng đường dẫn này để đơn giản hóa / tối ưu hóa đã đề cập ở trên:
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
},
},
})