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?
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
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"`
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With