2016-08-04 25 views
1
  1. Wenn mgo mit einem Objekt eines Gostruct Typs in eine Sammlung in einer Datenbank als MongoDB Dokument einzufügen, sind die Feldnamen aus Großbuchstaben geändert Fall automatisch zu senken?Ändert die Insert-Methode von mgo Feldnamen von Großbuchstaben in Kleinbuchstaben?

  2. Wenn ja, warum macht die Einfügemethode von mgo das?

Danke.


Hier ist mein Go Programm, das mgo verwendet weist darauf hin,

Einsetzen und Abfrageoperationen in einem MongoDB-Server

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) 

} 

Der Ausgang des Laufens seine kompilierte Programm auszuführen

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

Durch den Anschluss auf den MongoDB-Server von seiner Shell aus, fand ich, dass die Feldnamen in dem eingefügten Dokument von Großbuchstaben Anfangsbuchstaben zu h geändert haben aving Klein ersten Buchstaben

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

Also in meinem Go Programm, änderte ich

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 

und es gibt ein passendes Dokument

$ ./minimal-example 
count:100 

Antwort

4

zu sein Die Feldnamen sind niedriger sed pro den mgo/bson documentation:

Die Kleinbuchstabe Feldnamen als Schlüssel für jedes exportierte Feld verwendet werden, aber dieses Verhalten mit dem jeweiligen Feld-Tag geändert werden.

Verwenden Sie das bson-Feld-Tag, um die Behandlung von Strukturnamen durch mgo/bson zu überschreiben. Hier sind die Tags, die erforderlich sind, um die Feldnamen der Struktur zu vergleichen:

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