Golang mongodb聚合

时间:2017-03-16 12:11:28

标签: mongodb go aggregation-framework lookup mgo

我有一组用户。用户有一个int64“id”,让我们说“avatar”,“name”和其他用户id的数组。 我想要实现的是查询SINGLE用户,但我没有得到他的朋友ID的数组,而是想得到他的朋友的数组,包含他们的名字和头像。如何在golang中实现它?我找到了一些我需要的东西 - “查找”功能,但我无法理解如何使用它。

1 个答案:

答案 0 :(得分:5)

您无法直接将$lookup应用于数组,但您可以先$unwind进行数组。

如果没有示例文档,下面的代码片段就是一种通用方法:

pipeline := []bson.M{ 
    bson.M{"$match": bson.M{"_id": userId }},
    bson.M{"$unwind": "$otherUsersIdsArrayName"},
    bson.M{
        "$lookup": bson.M{ 
            "from": userCollectionName, 
            "localField": otherUsersIdsArrayName, 
            "foreignField": "id", 
            "as": "friend"
        }
    },
    bson.M{"$unwind": "$friend"},
    bson.M{
        "$group": bson.M{
            "_id": "id",
            "id": bson.M{"$first": "$id"},
            "name": bson.M{"$first": "$name"},
            "avatar": bson.M{"$first": "$avatar"},
            otherUsersIdsArrayName: bson.M{ "$push": "$friend"}
        }
    }
}
pipe := collection.Pipe(pipeline)
resp := []bson.M{}
err = pipe.All(&resp)

我应该提到聚合/管道返回bson.M,而不是水合用户对象。毕竟,Mongo不是关系数据库。