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

标签 mongodb go mgo

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

我的 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"}]}

听起来你能抽象出一个游戏

type Game struct {
    Players []Player `bson:"players"`
}

你的电话将进入 &game

var game Game
collection.Find(bson.M{"...").One(&game)

关于mongodb - 使用 mgo Golang 从 MongoDB 子文档数组中解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53677082/

相关文章:

go - 我应该如何组织我的 go 文件以支持跨平台构建和强制一致性?

go - 如何删除多级 map

重新执行过程的 Golang 代码覆盖率?

mongodb - 去 + MongoDB : polymorphic queries

mongodb - 不了解 mongoDB 更新如何在 Go 中工作

node.js - 仅在 mongoose 中的填充数组中删除文档 objectid

mongodb - ubuntu 上默认安装 mongo.exe 在哪里?

c# - 来自最新 .Net MongoDb.Driver 的连接问题

mongodb - 使用 FindAndModify 在官方 Mongo Go 驱动程序中运行查询

json - 将 _id 解码为 id 不起作用