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

标签 mongodb go mgo

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

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

$ 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

最佳答案

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

The lowercased field name is used as the key for each exported field, but this behavior may be changed using the respective field tag.

使用 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"`
}

关于mongodb - mgo 的 insert 方法是否将字段名称从大写更改为小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778360/

相关文章:

regex - Mongo查询语法错误

javascript - Nodejs GET REST API 和频繁访问 MongoDb 数据库

rest - 如何使用Swagger生成的Golang模型制作DTO

mongodb - 如何使用 mgo 编写查询 $centerSphere

Golang 导入的字段与标准字段声明的行为不同

javascript - 将 Mongoose 聚合函数返回 Angular

ruby-on-rails - 通过 users_controller.rb 中的代码修改用户的数据库

使用golang的facebook登录服务器端不起作用

go - 为什么在预分配的 slice 上追加比索引更快?

mongodb - Golang MGO Group By multiple params 并按日期时间抓取最后一个