2016-08-04 15 views
1
  1. 当使用mgoGostruct类型的对象作为文档插入到MongoDB数据库的集合中时,字段的名称是否会自动从大写更改为小写?mgo的插入方法是否将字段名称从大写更改为小写?

  2. 如果是,为什么插入方法mgo这样做?

谢谢。


这里是我的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) 

} 

运行它的编译程序的输出指出

$ ./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 

通过连接进行插入和查询操作从它的shell到MongoDB服务器,我发现插入文档中的字段名已经从大写的第一个字母变成了h AVING小写首字母

$ 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 } 

所以在我Go程序,我改变

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 

,并有一个匹配文档

$ ./minimal-example 
count:100 

回答

4

字段名称是lowerca sed按mgo/bson documentation

小写字段名称用作每个导出字段的关键字,但可以使用各自的字段标记更改此行为。

使用bson字段标记来覆盖mgo/bson对结构名称的处理。以下是匹配结构字段名称所需的标签:

type Record struct { 
    Dimension_id int  `bson:"Dimension_id"` 
    Attribute string  `bson:"Attribute"` 
    Hour string   `bson:"Hour"` 
    Frequency_count int `bson:"Frequency_count"` 
} 
相关问题