我有两个系列:评级和预订。
在预订系列中,我有一个字段" _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代码一样,我需要使用连接查询发送另一个条件。我可以一起完成这两件事吗?
提前致谢。
答案 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)
通过这种方式,我可以通过将两个集合连接在一起以及不同的查询来获得评级计数。