为什么我从mongodb获取json中某个字段的所有零值?

为什么我从mongodb获取json中某个字段的所有零值?

问题描述:

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.

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