MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB और Golang के साथ लुकअप के संदर्भ में मान प्राप्त करें

सबसेकर रहा हूं (और सबसे कठिन हिस्सा) जो आप चाहते हैं वह आसानी से मोंगोडीबी में किया जा सकता है। "मूल", "प्रीमियम" या "मानक" लौटाते समय अंतिम चरण सबसे अधिक संभावना भी किया जा सकता है, लेकिन मुझे लगता है कि यह परेशानी के लायक नहीं है क्योंकि यह गो में तुच्छ है।

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
        },
    },
})


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB अस्तित्व की जांच कैसे करें

  2. कैसे जांचें कि क्या मोंगोडब ऊपर है और बैश स्क्रिप्ट से कनेक्शन स्वीकार करने के लिए तैयार है?

  3. मोंगोडब में php का उपयोग करके फुलटेक्स्ट इंडेक्स में कैसे खोजें?

  4. MongoDB योग () डेटा

  5. angularJS के साथ काम नहीं कर रहे फ़ंक्शन को हटाएं