Golang MongoDB 聚合查询

4

我有一个用户集合,每个用户都有一个int64类型的“id”,以及“avatar”、“name”和其他用户id的数组。我想查询单个用户,但是不想得到他的朋友id数组,而是想得到包含他的朋友姓名和头像的朋友数组。在golang中如何实现?我已经找到了一些类似于我需要的东西——"lookup"函数,但我不知道如何正确使用。


这似乎是一个关于Mongo的问题,而不是关于Golang的问题。 https://docs.mongodb.com/v3.2/tutorial/query-documents/#query-method。没有一些代码,帮助你有些困难。 - Benjamin Kadish
1个回答

8

您不能直接将$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不是关系型数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接