【问题标题】:Golang mgo getting empty objectsGolang mgo得到空对象
【发布时间】:2017-08-04 13:52:53
【问题描述】:

我正在尝试学习 Go API 开发。我有一个在 Docker 容器中运行的 MongoDB 实例。我正在尝试遵循一些指南,但在简单查询上失败了。我不完全理解这里 BSON 和 JSON 标签的使用。我知道这些术语是什么意思。所以这是我的代码。

import (
    "fmt"
    "time"

    "gopkg.in/mgo.v2/bson"
)

const (
    hosts      = "localhost:27017"
    database   = "my_database"
    username   = "dev1"
    password   = "password123"
    collection = "users"
)

type users struct {
    user string `bson:"user" json:"user"`
    data string
}

func main() {

    fmt.Println("Starting Application!")

    info := &mgo.DialInfo{
        Addrs:    []string{hosts},
        Timeout:  60 * time.Second,
        Database: database,
        Username: username,
        Password: password,
    }

    session, err1 := mgo.DialWithInfo(info)
    if err1 != nil {
        panic(err1)
    }
    defer session.Close()

    col := session.DB(database).C(collection)

    var user users
    var books []users
    var username = "cat"

    col.Insert(&users{user: "dog", data: "blah"})
    err3 := col.Find(bson.M{"user": username}).One(&user)
    fmt.Println(user)
    fmt.Println(err3)
    count, err2 := col.Count()
    if err2 != nil {
        panic(err2)
    }
    fmt.Println(fmt.Sprintf("Messages count: %d", count))

    fmt.Println(user)
    col.Find(bson.M{}).All(&books)
    fmt.Println(books)
}

基本上,我在打印线上得到了空对象,但得到了正确的消息计数。如果有帮助,我会使用 robomongo 插入对象。

【问题讨论】:

  • 你只插入了"dog",你怎么能找到"cat"?我的意思是它“可能”已经存在,但是作为一个自包含的示例,您的代码似乎自相矛盾,并且正在寻找与您实际插入的内容不同的东西。因此,如果您正在写入正确的来源,那么"dog" 在哪里?这不应该表明您实际上是在写信到不同的地方吗?
  • 好问题。我已经插入了猫。我尝试插入 dog,然后阅读所有内容以查看 mgo 的插入是否与 robomongo 不同。但是狗甚至没有被插入。查看我附上的图片。

标签: mongodb go struct mgo


【解决方案1】:

您必须导出结构的字段,否则mgo 包会忽略它们。将users 的字段更改为UserData

type users struct {
    User string `bson:"user" json:"user"`
    Data string `bson:"data" json:"data"` 
}

默认情况下,当从 MongoDB 转换/存储/检索结构值时,使用字段名称。如果您想使用不同的名称,您可以使用tags 来告诉字段应该映射到什么名称。

【讨论】:

  • 谢谢,我今晚回家后检查一下
  • 另外,你能解释一下导出是什么吗?我已经做了很多节点,使用节点你只需键入 export。是这里的 bson 和 json 标签是什么让它导出的?
  • @camccar 以大写字母开头的标识符被导出,这意味着它们可以从所有包中访问。不以大写字母开头的标识符不会被导出,只能从声明包中访问。
  • 好提示!谢谢,我也有同样的问题。我想知道是否有办法让 mgo 自动使用 struct 的字段,无论字段是否大写。
  • @Mithril 字段必须被导出,否则mgo 包将无权访问它们。这是语言限制,不是mgo 的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 2017-11-02
  • 2018-01-02
  • 1970-01-01
  • 2013-09-03
  • 2019-07-31
相关资源
最近更新 更多