Why am I getting all zero value for certain field in my json from mongodb?

你离开我真会死。 提交于 2020-01-30 13:13:33

问题


I'm fetching my data from MongoDB atlas in a Go web Server using the official mongodb-go-driver. I'm using json.Marshal to convert to json. but all values of certain fields becomes Zero.

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()
}

My Expected Output:

[{
    "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
}]

Actual Result:

[{
    "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
}]

Values of minute,hour,date,month and year are Correct and Unchanged but all the values of moisture, humidity and temperature becomes zero.


回答1:


You have to use bson tags when marshalling from / to MongoDB. json tags are for the encoding/json package, and they are not used (ignored) by the Mongo driver.

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

If bson tags are missing from your struct fields, the default name used in MongoDB will be the struct field name starting with lowercased letters, that's why some (most) of the fields were matched but not Moisture1 (it differs more than just the capital first letter from moisture_1).

If you also want to use the encoding/json package with this struct, you may provide both:

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


来源:https://stackoverflow.com/questions/58075716/why-am-i-getting-all-zero-value-for-certain-field-in-my-json-from-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!