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