Невозможно декодировать SubValue ObjectId из MongoDB приводит к Голангу - PullRequest
1 голос
/ 01 апреля 2019

Я использую MongoDb Go Driver и не могу получить подзначение ObjectId из JSON, декодированного в моих структурах.

Примечание: Я использую библиотеку / API, отличную от этого вопроса , поэтому, пожалуйста, не отмечайте это как дубликат.

import (
    "net/http"
    "github.com/go-chi/chi"
    "encoding/json"
    "time"
    "context"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "fmt"
)

У меня есть тип структуры, подобной этой, для обработки результатов

type Contact struct {
    Id  struct {
        ObjId   string  `json:"$oid"`
    } `json:"_id"`
    Name    string `json:"name"`
    Email   string `json:"email"`
    Health  struct {
        Weight  int `json:"weight"`
        Height  int `json:"height"`
    } `json:"health"`    
}

А потом я иду, чтобы получить контакты следующим образом:

var contacts []Contact
ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
cursor, err := collection.Find(ctx, bson.M{})
if err != nil {
    panic(err)
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
    var contact Contact
    fmt.Println(cursor)
    cursor.Decode(&contact)
    contacts = append(contacts, contact)
}
if err := cursor.Err(); err != nil {
    panic(err)
}
// I want to do more with the contacts, but .Id is empty :-(
fmt.Println(contacts)

Подполя для "health" появляются точно так, как они должны, но по какой-то причине подполе из "_id" части результатов нигде не найдено. Может кто-нибудь помочь мне с этим ??

Ответ JSON из базы данных выглядит следующим образом, и по какой-то причине я могу получить подполя для поля health, но не для поля _id.Почему бы и нет?

Необработанный JSON-ответ БД

[{
    "_id": { 
        "$obj": "5c601648ae25e40e2631c3ef" 
    }, 
    "name": "Bob Smith", 
    "email": "bob@smith.com", 
    "health": { 
        "height": 192, 
        "weight": 85 
    }
}]

fmt.Println на выходе декодированного массива contacts:

[{{} Bob Smith bob@smith.com {192 85}}]

Ответы [ 2 ]

3 голосов
/ 01 апреля 2019

Благодаря этому превосходному учебнику и этому ответчику Я смог найти ответ.

Мне нужно было установить ID в моей структуре как primitive.ObjectID и убедиться, что я импортировал "go.mongodb.org/mongo-driver/bson/primitive"

type Contact struct {
    ID      primitive.ObjectID  `json:"_id" bson:"_id"
    Name    string `json:"name" bson:"name"`
    Email   string `json:"email" bson:"email"`
    Health  struct {
        Weight  int `json:"weight" bson:"weight"`
        Height  int `json:"height" bson:"height"`
    } `json:"health" bson:"health"`    
}

Для тех, кто хочет использовать официальный драйвер MongoDB Go, см. В этом руководстве ниже очень хорошее объяснение и примеры того, как выполнять все операции CRUD, необходимые для базового API REST и т. Д.

Использование официального драйвера MongoDB Go

0 голосов
/ 01 апреля 2019

смотрит на меня, что тебе не хватает тегов 'bson'. Вы правильно пометили json, но не bson. С остальными полями все в порядке, потому что они по умолчанию корректируют теги bson, но по умолчанию в _id просто id. Попробуйте добавить

json:"_id" bson:"_id"

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