[英]Does mgo's insert method change field names from upper case to lower case?
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? 当使用mgo
将Go
struct
类型的对象作为文档插入到MongoDB数据库的集合中时,字段名称是否自动从大写更改为小写?
If yes, why does the insert method of mgo
do that? 如果是,为什么mgo
的insert方法会这样做?
Thanks. 谢谢。
Here is my Go
program which uses mgo
to perform insertion and query operations in a MongoDB server 这是我的Go
程序,它使用mgo
在MongoDB服务器中执行插入和查询操作
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 通过从其外壳连接到MongoDB服务器,我发现插入文档中的字段名称已从首字母大写更改为首字母小写
$ 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 所以在我的Go
程序中,我改变了
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 : 根据mgo / bson文档 ,字段名称是小写的:
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. 使用bson字段标记可以覆盖mgo / bson对结构名称的处理。 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"`
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.