2017-09-26 52 views
1

我有兩個集合:收視率和預訂。在MongoDB中以ID爲基礎對兩個集合進行加入

在預訂集合我有一個字段「_id」這是正常的文檔ID。我還在預訂集合中保存了一個字段「location_id」。在收視率收藏中,我將預訂ID標記爲「booking_id」字段。

查詢1:

我想「LOCATION_ID」的基礎上,收視率計,這意味着首先我需要得到LOCATION_ID的基礎上預訂的話,我需要找到該預訂評級(具有「location_id」的位置)。

爲此,我已經完成的MongoDB通過聚合兩個集合這樣加入:

getCollection := mongoSession.DB(config.Database).C(config.RatingsCollection) 
    pipe := getCollection.Pipe([]bson.M{ 
             bson.M{"$match": bson.M{"location_id": 2}}, 
             bson.M{"$lookup": bson.M{ 
                  "localField" : "booking_id", 
                  "from"   : config.BookingsCollection, 
                  "foreignField" : "_id"}}, 
             bson.M{"$count": "ratings_count"}, }) 
    err = pipe.All(&result) 

QUERY2:

此外,我需要知道我們如何才能增加更多的條件(這是要應用在同一個集合中)我們的查詢?

我需要執行此連接操作查詢以及一些其他條件,如收視率集合我有另一個字段,如「rating_date」,其中包含時間戳值。

condition := bson.M{} 
condition["review_date"] = bson.M{"$gte": startDate, "$lte": endDate} 
allratingsCount, err := models.GetRatingsCount(condition) 

func GetRatingsCount(query interface{}) (int, error){ 
    count, err := GetRecordsCount(config.RatingsCollection, query) 
    if err != nil{ 
     return 0, err 
    } 
    return count, err 
} 

贊在代碼中,我需要發送另一個條件加入查詢。我可以一起執行這兩件事嗎?

在此先感謝。

+0

你問如何添加另一個'$ match'階段到管道? –

+0

你可以這麼說。但是,我是否需要在同一個連接查詢中匹配其他條件?沒有辦法單獨管理這些條件(除了加入)嗎? –

+0

那麼你「*需要發送另一個條件加入查詢*」和「*一起執行這兩件事*」或不? –

回答

0

我找到了我的問題的答案。這裏是複雜的聯接操作系兩個不同的集合來獲得等級的單數:

getCollection := mongoSession.DB("example_db").C("ratings") 
    pipe := getCollection.Pipe([]bson.M{ 
             bson.M{"$lookup": bson.M{ 
                  "localField" : "booking_id", 
                  "from"   : "bookings", 
                  "foreignField" : "_id", 
                  "as"   : "data" }}, 
             bson.M{"$unwind": "$data"}, 
             bson.M{"$match": bson.M{"location_id": 1, "industry_id": 2, "proivder_id": 10, "rating": 4.5, "rating_date": bson.M{ "$gte": startDate, "$lte": endDate}}}, 
             bson.M{"$group": bson.M{ 
                  "_id": "null", 
                  "count": bson.M{"$sum": 1} } } }) 
    err = pipe.One(&result) 

這樣,我又通過一起隨不同的查詢連接兩個集合獲取收視率的計數。

相關問題