MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Nhận giá trị trong tham chiếu tra cứu với MongoDB và Golang

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb cập nhật nhiều

  2. Xây dựng truy vấn MongoDb C # GeoNear

  3. MongoDB - Id trả về của mục đã chèn

  4. lỗi mongoDB:Lỗi:không kết nối được với [localhost:27017]

  5. Không thể ĐĂNG trong nodejs và mongodb trên openshift