Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does mgo's insert method change field names from upper case to lower case?

Tags:

mongodb

go

mgo

  1. When using mgo to insert an object of a Go struct type into a collection in a MongoDB database as a document, are the fields' names changed from upper case to lower case automatically?

  2. If yes, why does the insert method of mgo do that?

Thanks.


Here is my Go program which uses mgo to perform insertion and query operations in a MongoDB server

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type Record struct {
    Dimension_id  int
    Attribute string
    Hour string
    Frequency_count int
}

func main(){

    session, err := mgo.Dial("localhost")
    if err != nil {
        panic(err)
    }
    defer session.Close()

    c := session.DB("TVFS").C("c20160712")

    // insert
    doc := Record{2, "good", "20160712_06", 100}
    err = c.Insert(&doc)
    if err != nil {
        panic(err)
    }

    // query
    result := Record{}
    err = c.Find(bson.M{"Dimension_id": 2, "Attribute": "good", "Hour": "20160712_06" }).One(&result) // no matching document
    // err = c.Find(bson.M{"dimension_id": 2, "attribute": "good", "hour": "20160712_06" }).One(&result) // one matching document
    if err != nil {
        panic(err)
    }
    fmt.Printf("count:%d\n", result.Frequency_count)

}

The output of running its compiled program points out

$ ./minimal-example 
panic: not found

goroutine 1 [running]:
panic(0x61d500, 0xc82000a880)
    /usr/local/go/src/runtime/panic.go:481 +0x3e6
main.main()
    /home/t/program_files/mywork/go/src/tvfs/mongodb/minimal-example.go:38 +0x701

By connecting to the MongoDB server from its shell, I found that the field names in the inserted document has changed from having capitalized first letters to having lower-case first letters

$ mongo
MongoDB shell version: 3.2.8
connecting to: test
Server has startup warnings: 
2016-08-04T11:58:21.138-0400 I CONTROL  [initandlisten] 
2016-08-04T11:58:21.138-0400 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-08-04T11:58:21.138-0400 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-08-04T11:58:21.138-0400 I CONTROL  [initandlisten] 
2016-08-04T11:58:21.139-0400 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-08-04T11:58:21.139-0400 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-08-04T11:58:21.139-0400 I CONTROL  [initandlisten] 
> show dbs
TVFS   0.000GB
local  0.000GB
> use TVFS
switched to db TVFS
> show collections
c20160712
> db.c20160712.find()
{ "_id" : ObjectId("57a3978491c3b3a393e9be2d"), "dimension_id" : 2, "attribute" : "good", "hour" : "20160712_06", "frequency_count" : 100 }

So in my Go program, I changed

    err = c.Find(bson.M{"Dimension_id": 2, "Attribute": "good", "Hour": "20160712_06" }).One(&result) // no matching document

to be

    err = c.Find(bson.M{"dimension_id": 2, "attribute": "good", "hour": "20160712_06" }).One(&result) // one matching document

and there is one matching document

$ ./minimal-example 
count:100
like image 754
Tim Avatar asked Mar 12 '23 12:03

Tim


1 Answers

The field names are lowercased per the mgo/bson documentation:

The lowercased field name is used as the key for each exported field, but this behavior may be changed using the respective field tag.

Use the bson field tag to override mgo/bson's handling of struct names. Here are the tags required to match the struct field names:

type Record struct {
   Dimension_id  int     `bson:"Dimension_id"`
   Attribute string      `bson:"Attribute"`
   Hour string           `bson:"Hour"`
   Frequency_count int   `bson:"Frequency_count"`
}
like image 123
Bayta Darell Avatar answered Mar 14 '23 16:03

Bayta Darell