Unmarshal из массива поддокументов MongoDB с помощью mgo Golang - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь выяснить, как получить отдельный поддокумент из массива и распаковать его в структуру.

Мой документ на монго выглядит так:

{ 
    "_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"`
}

Из командной строки Монго я могу сделать

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 и использую драйвер mgo.v2 для Go.

1 Ответ

0 голосов
/ 08 декабря 2018

Это потому, что вы не захватываете одного игрока, вы захватываете игроков.как в ответе от команды 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)
...