2016-08-04 4 views
1
  1. При использовании mgo вставить объект в Gostruct типа в коллекции в базе данных 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 

Подключив к серверу 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

Имена полей - нижняя СЭД согласно 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"` 
}