我试图弄清楚如何从数组中获取单个子文档并将其解码为结构。

我的mongo文件如下所示:

{
    "_id" : ObjectId("abc123"),
    "gamecode" : "abc123"
    "players" : [
        {
            "playerid" : ObjectId("abc123"),
            "username" : "test",
        },
        {
            "playerid" : ObjectId("abc456"),
            "username" : "test2"
        }]
 }

我有一个播放器结构,如下所示:
type Player struct {
    PlayerID bson.ObjectId `bson:"playerid" json:"playerid"`
    Username string        `bson:"username" json:"username"`
}

从mongo命令行,我可以执行
db.games.find(({"players.playerid": ObjectId('abc123')}, {"_id": 0, "players.$":1})

哪个返回
{"players" : [{ "playerid" : ObjectId("abc123"), "username" : "test"}]}

但是我很难弄清楚如何在Go中实现相同的功能,以便从查询结果中获得填充的播放器结构。我一直在尝试以下代码的不同配置,但始终会导致结构为空。我在这里想念什么?
player := Player{}
collection.Find(bson.M{"players.playerid": bson.ObjectIdHex(pid)}).Select(bson.M{"_id": 0, "players.$": 1}).One(&player)

我正在运行最新的MongoDB版本,并且正在使用Go的mgo.v2驱动程序。

最佳答案

这是因为您没有捕获单个玩家,而是捕获了玩家。
就像在mongo命令的响应中一样:

{"players" : [{ "playerid" : ObjectId("abc123"), "username" : "test"}]}

听起来您可以对game进行抽象
type Game struct {
    Players []Player `bson:"players"`
}

您的通话将变成&game
var game Game
collection.Find(bson.M{"...").One(&game)

10-06 15:02