Golang mgo 获取空对象

4

我正在尝试学习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插入了这些对象。

Objects in Collection


当你只插入了“dog”时,如何找到“cat”?我的意思是,“可能”它已经存在,但作为一个自包含的例子,你的代码似乎与自己相矛盾,并且正在寻找与你实际插入的内容不同的东西。因此,如果你正在写入正确的源,那么“dog”在哪里?这不应该表明你实际上正在写入其他地方吗? - Neil Lunn
好问题。我已经插入了猫。我尝试插入狗,然后读取所有内容,看看mgo是否与robomongo插入不同。但是狗甚至没有被插入。请查看我附加的图片。 - camccar
1个回答

9

如果不导出结构体的字段,mgo包会忽略它们。将users的字段更改为UserData

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

默认情况下,当从MongoDB中转换/存储/检索结构值时,使用字段名称。如果您想使用不同的名称,则可以使用标签来指定应将字段映射到哪些名称。


谢谢,我今晚回家后会查看。 - camccar
另外,你能解释一下导出是做什么的吗?我已经做了很多node相关的工作,而在node中,你只需要键入export。这里的bson和json标签是否是使其被导出的原因? - camccar
2
以大写字母开头的标识符是公开的,这意味着它们可以从所有包中访问。不以大写字母开头的标识符是非公开的,只能从声明它们的包中访问。 - icza
好的提示!谢谢,我有同样的问题。不知道是否有一种方法可以使mgo自动使用结构体的字段,无论字段是大写还是小写。 - Mithril
@Mithril Fields必须被导出,否则mgo包将无法访问它们。这是一种语言限制,而不是mgo的限制。 - icza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接