使用 mgo Golang 从 MongoDB 子文档数组中解组

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


我的 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 驱动程序。


拉风的咖菲猫
浏览 95回答 1
1回答

哆啦的时光机

这是因为您不捕获单个玩家,而是捕获玩家。就像来自 mongo 命令的响应:{"players" : [{ "playerid" : ObjectId("abc123"), "username" : "test"}]}听起来你可以抽象一个gametype Game struct {    Players []Player `bson:"players"`}你的电话将是&gamevar game Gamecollection.Find(bson.M{"...").One(&game)
打开App,查看更多内容
随时随地看视频慕课网APP