Почему я получаю все нулевые значения для определенного поля в моем json из mongodb? - PullRequest
0 голосов
/ 24 сентября 2019

Я извлекаю свои данные из атласа MongoDB на веб-сервере Go, используя официальный драйвер mongodb-go.Я использую json.Marshal для преобразования в json.но все значения определенных полей обнуляются.

package main

import (
"context"
"fmt"
"log"

"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)

var c = GetClient()

type PlantData struct {
Minute       int     `json:"minute"`
Date         int     `json:"date"`
Moisture1    int     `json:"moisture_1"`
Hour         int     `json:"hour"`
Month        int     `json:"month"`
Year         int     `json:"year"`
Humidity1    float64 `json:"humidity_1"`
Temperature1 float64 `json:"temperature_1"`
}

func GetClient() *mongo.Client {
    clientOptions := options.Client().ApplyURI("MY_MONGODB_URI")
    client, err := mongo.NewClient(clientOptions)
    if err != nil {
        log.Fatal(err)
    }
    err = client.Connect(context.Background())
    if err != nil {
        log.Fatal(err)
    }
    return client
}

func ReturnAllPlantsData(client *mongo.Client, filter bson.M) []*PlantData {
    var plantsdata []*PlantData
    collection := client.Database("iot").Collection("tomatos")
    cur, err := collection.Find(context.TODO(), filter)
    if err != nil {
        log.Fatal("Error on Finding all the documents", err)
    }
    for cur.Next(context.TODO()) {
        var plantdata PlantData
        err = cur.Decode(&plantdata)
        if err != nil {
            log.Fatal("Error on Decoding the document", err)
        }
        plantsdata = append(plantsdata, &plantdata)
    }
    return plantsdata
}

func getting(g *gin.Context) {  
     plantsdatas := ReturnAllPlantsData(c, bson.M{})
     ans, _ := json.Marshal(plantsdatas)
     fmt.Println(string(ans))
     c.String(200, string(ans))
}

func main() {
    err := c.Ping(context.Background(), readpref.Primary())
    if err != nil {
        log.Fatal("Couldn't connect to the database", err)
    } else {
        log.Println("Connected!")
    }

    router := gin.Default()
    router.GET("/data", getting)    
    router.Run()
}

Мой ожидаемый результат:

[{
    "minute": 3,
    "date": 14,
    "moisture_1": 96,
    "hour": 23,
    "month": "02",
    "year": 2019,
    "humidity_1": 77.2,
    "temperature_1": 22.7
}, {
    "minute": 8,
    "date": 14,
    "moisture_1": 96,
    "hour": 23,
    "month": "02",
    "year": 2019,
    "humidity_1": 78.1,
    "temperature_1": 22.8
}]

Фактический результат:

[{
    "minute": 3,
    "date": 14,
    "moisture_1": 0,
    "hour": 23,
    "month": "02",
    "year": 2019,
    "humidity_1": 0,
    "temperature_1": 0
}, {
    "minute": 8,
    "date": 14,
    "moisture_1": 0,
    "hour": 23,
    "month": "02",
    "year": 2019,
    "humidity_1": 0,
    "temperature_1": 0
}]

Значения минут, часов, даты, месяца и года являются правильными и неизменными, новсе значения влажности, влажности и температуры становятся равными нулю.

1 Ответ

3 голосов
/ 24 сентября 2019

Вы должны использовать теги bson при сортировке из / в MongoDB.Теги json предназначены для пакета encoding/json и не используются (игнорируются) драйвером Mongo.

type PlantData struct {
    Minute       int     `bson:"minute"`
    Date         int     `bson:"date"`
    Moisture1    int     `bson:"moisture_1"`
    Hour         int     `bson:"hour"`
    Month        int     `bson:"month"`
    Year         int     `bson:"year"`
    Humidity1    float64 `bson:"humidity_1"`
    Temperature1 float64 `bson:"temperature_1"`
}

Если теги bson отсутствуют в ваших полях структуры, используется имя по умолчаниюв MongoDB имя структурного поля будет начинаться с букв в нижнем регистре, поэтому некоторые (большинство) полей были сопоставлены, но не Moisture1 (отличается больше, чем просто заглавная первая буква от moisture_1).

Если вы также хотите использовать пакет encoding/json с этой структурой, вы можете предоставить оба варианта:

type PlantData struct {
    Minute       int     `bson:"minute" json:"minute"`
    Date         int     `bson:"date" json:"date"`
    Moisture1    int     `bson:"moisture_1" json:"moisture_1"`
    Hour         int     `bson:"hour" json:"hour"`
    Month        int     `bson:"month" json:"month"`
    Year         int     `bson:"year" json:"year"`
    Humidity1    float64 `bson:"humidity_1" json:"humidity_1"`
    Temperature1 float64 `bson:"temperature_1" json:"temperature_1"`
}
...