Изо всех сил пытается преобразовать объект MongoDB singleResult в структуру Go - PullRequest
0 голосов
/ 23 февраля 2019

Я пытался следовать документации здесь и здесь , но безуспешно.

Я хочу получить singleResult от FindOne на Collection named moviesCollection, а затем используйте Decode или Unmarshal, чтобы поместить эти значения в структуру.Значения в структуре JSONData точно такие же, как в каждом Document

Я использую официальный драйвер mongodb github.com/mongodb/mongo-go-driver

Вот пример того, что япробовал:

mongoContext, cancelContext := context.WithTimeout(context.Background(), 10*time.Second)

defer cancelContext()

mongoClient, _ := mongo.Connect(mongoContext, options.Client().ApplyURI("mongodb://localhost:27017"))
moviesCollection := mongoClient.Database("Entertainment").Collection("Movies")

moviesCollection.InsertOne(mongoContext, bson.M{"_id": "Deadpool", "Path": "path/to/file"})

singleResult := moviesCollection.FindOne(mongoContext, bson.M{"_id": "Deadpool"})

if singleResult.Err() != nil {
    log.Println("Find error: ", singleResult.Err())
}

JSONData := struct {
    Path string `json:"Path"`
}{}

decodeError := singleResult.Decode(&JSONData)

if decodeError != nil {
    log.Println("Decode error: ", decodeError)
}

fmt.Println("Path: ", JSONData.Path)

Однако никаких ошибок не возникает, и JSON.Path выдает пустую строку.

Я также пытался использовать bson.D{{"_id", "Deadpool"}} вместо bson.M{"_id": "Deadpool"}

Я могу подтвердить, что JSON.Path не является пустой строкой, так как я проверил базу данных с помощью MongoDB Compass. Запись содержит следующее:

{"_id":"Deadpool","Path":"path/to/file"}

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Внутри MongoDB используется bson .Измените вашу структуру, как показано ниже:

С

JSONData := struct {
    Path string `json:"Path"`
}{}

на

JSONData := struct {
    Path string `bson:"Path"`
}{}
0 голосов
/ 26 февраля 2019

Привет, как уже упоминал simagix, вы должны иметь возможность изменить свой тег с JSON на bson:

`bson:"Path"`

Другой вариант, если вам нужно получить более общий результат, это передать ему объект D, напримерИтак:

JSONData := &bson.D{}
decodeError := singleResult.Decode(JSONData)

Затем вы можете получить всю информацию через карту, используя функцию JSON.Data.Map.

0 голосов
/ 23 февраля 2019

Если вы используете mongo-go-driver >= v.0.1.0, то, взглянув на go-doc , все выглядит довольно просто:

filter := bson.D{{"hello", "world"}}
err := collection.FindOne(context.Background(), filter).Decode(&result)
if err != nil { return err }
// do something with result...

Итак, вам нужно:

package main

import (
    "context"

    "github.com/mongodb/mongo-go-driver/bson"
    "github.com/mongodb/mongo-go-driver/mongo
)

func main() {

    ctx := context.Background()

    client, err := mongo.NewClient("mongodb://localhost:27017")
    if err != nil {
       ...
    }

    if err := client.Connect(ctx); err != nil {
        ...
    }

    defer client.Disconnect(ctx)

    collection := client.Database("myDb").Collection("movies")

    filter := bson.D{{"_id", "sometitle"}}

    var result JSONData

    err := collection.FindOne(ctx, filter).Decode(&result)
    if err != nil { 
        ...
    }

    // Do Something cool here

}

Я вижу, вы используете Title для фильтрации документов.Обратите внимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...