MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Вземете стойност в справка за търсене с MongoDB и Golang

Правя повечето (и най-трудната част) от това, което искате, може лесно да се направи в MongoDB. Последната стъпка при връщане на „основен“, „премиум“ или „стандартен“ най-вероятно също може да бъде направена, но мисля, че не си струва да се мъчите, тъй като това е тривиално в Go.

В 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. Mongoose попълва масив от поддокументи

  2. Mongo преобразува вградения документ в масив

  3. Декодиране на регистрационните файлове за грешки в MongoDB

  4. Групов резултат по 15 минути времеви интервал в MongoDb

  5. пропуснат брой 0 в агрегатна функция