简体   繁体   English

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

[英]Does mgo's insert method change field names from upper case to lower case?

  1. When using mgo to insert an object of a Go struct type into a collection in a MongoDB database as a document, are the fields' names changed from upper case to lower case automatically? 当使用mgoGo struct类型的对象作为文档插入到MongoDB数据库的集合中时,字段名称是否自动从大写更改为小写?

  2. If yes, why does the insert method of mgo do that? 如果是,为什么mgo的insert方法会这样做?

Thanks. 谢谢。


Here is my Go program which uses mgo to perform insertion and query operations in a MongoDB server 这是我的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)

}

The output of running its compiled program points out 运行其编译程序的输出指出

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

By connecting to the MongoDB server from its shell, I found that the field names in the inserted document has changed from having capitalized first letters to having lower-case first letters 通过从其外壳连接到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 }

So in my Go program, I changed 所以在我的Go程序中,我改变了

    err = c.Find(bson.M{"Dimension_id": 2, "Attribute": "good", "Hour": "20160712_06" }).One(&result) // no matching document

to be 成为

    err = c.Find(bson.M{"dimension_id": 2, "attribute": "good", "hour": "20160712_06" }).One(&result) // one matching document

and there is one matching document 并且有一个匹配的文档

$ ./minimal-example 
count:100

The field names are lowercased per the mgo/bson documentation : 根据mgo / bson文档 ,字段名称是小写的:

The lowercased field name is used as the key for each exported field, but this behavior may be changed using the respective field tag. 小写的字段名称用作每个导出字段的键,但是可以使用相应的字段标签更改此行为。

Use the bson field tag to override mgo/bson's handling of struct names. 使用bson字段标记可以覆盖mgo / bson对结构名称的处理。 Here are the tags required to match the struct field names: 以下是匹配结构字段名称所需的标签:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM