mgo的insert方法是否将字段名称从大写更改为小写?

时间:2016-08-04 22:26:08

标签: mongodb go mgo

  1. 使用mgoGo struct类型的对象作为文档插入MongoDB数据库中的集合时,字段的名称是否从大写字母更改自动小写?

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

  3. 感谢。

    这是我的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服务器,我发现插入文档中的字段名称已从首字母大写变为小写首字母

    $ 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
    

1 个答案:

答案 0 :(得分:4)

字段名称根据mgo/bson documentation小写:

  

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

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

type Record struct {
   Dimension_id  int     `bson:"Dimension_id"`
   Attribute string      `bson:"Attribute"`
   Hour string           `bson:"Hour"`
   Frequency_count int   `bson:"Frequency_count"`
}