在MongoDB中基于ID执行两个集合的连接

时间:2017-09-26 08:36:09

标签: mongodb join go

我有两个系列:评级和预订。

在预订系列中,我有一个字段" _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
}

与In代码一样,我需要使用连接查询发送另一个条件。我可以一起完成这两件事吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我找到了问题的答案。这是两个不同集合上的复杂JOIN操作,以获得单个评级计数:

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) 

通过这种方式,我可以通过将两个集合连接在一起以及不同的查询来获得评级计数。