सबसेकर रहा हूं (और सबसे कठिन हिस्सा) जो आप चाहते हैं वह आसानी से मोंगोडीबी में किया जा सकता है। "मूल", "प्रीमियम" या "मानक" लौटाते समय अंतिम चरण सबसे अधिक संभावना भी किया जा सकता है, लेकिन मुझे लगता है कि यह परेशानी के लायक नहीं है क्योंकि यह गो में तुच्छ है।
MongoDB में एग्रीगेशन फ्रेमवर्क
का उपयोग करें इसके लिए। यह mgo
. में उपलब्ध है पैकेज Collection.Pipe()
के ज़रिए
तरीका। आपको इसे एक टुकड़ा पास करना होगा, प्रत्येक तत्व एकत्रीकरण चरण से मेल खाता है। अधिक जानकारी के लिए इस उत्तर को पढ़ें:MongoDB संग्रह से कुल कैसे प्राप्त करें
अपने उदाहरण पर वापस। आपका GetEventLevel()
विधि इस तरह कार्यान्वित की जा सकती है:
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
}
अगर आपको ज़्यादा से ज़्यादा एक EventBoost
की ज़रूरत है (या एक ही समय में अधिक नहीं हो सकता है), $limit
. का उपयोग करें परिणामों को एक तक सीमित करने के लिए चरण, और $project
. का उपयोग करें केवल level
लाने के लिए फ़ील्ड और कुछ नहीं।
उपर्युक्त सरलीकरण/अनुकूलन के लिए इस पाइपलाइन का उपयोग करें:
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
},
},
})