2016-08-04 14 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"` 
} 
相關問題