mongodb - 使用 Go 检索 MongoDB 文档时出现问题

标签 mongodb go mgo

我有以下代码,我不确定它为什么不返回一段注释。我正在使用来自 labix.org 的 mgo 库连接到 MongoDB 并遵循他们的在线文档。

type Note struct {
    Url string
    Title string
    Date string
    Body string
}

func loadNotes() ([]Note) {
    session, err := mgo.Dial("localhost")
    if err != nil {
            panic(err)
    }
    defer session.Close()

    // Optional. Switch the session to a monotonic behavior.
    session.SetMode(mgo.Monotonic, true)

    c := session.DB("test").C("notes")

    notes := []Note{}
    iter := c.Find(nil).Limit(100).Iter()
    err = iter.All(&notes)
    if err != nil {
        panic(iter.Err())
    }

    return notes
}

func main() {
    notes := loadNotes()
    for note := range notes {
        fmt.Println(note.Title)
    }
}  

如果我只是打印出 notes 我得到的看起来像是两个结构的一部分,但我无法通过 notes.Title 或类似的方式访问它们那个。

[{ Some example title 20 September 2012 Some example content}]

这是我的文档的样子:

> db.notes.find()
{ "_id" : "some-example-title", "title" : "Some example title", "date" : "20 September 2012", "body" : "Some example content" }

真正的问题是它将笔记作为一大片而不是Note{}(我认为?)返回

如果我做错了什么,任何见解都会有所帮助。

最佳答案

你的问题在这里:

for note := range notes {
    fmt.Println(note.Title)
}

它应该是:

for _, note := range notes {
    fmt.Println(note.Title)
}

在 slice 上使用范围语句返回 i, v 形式的对,其中 i 是 slice 中的索引,v 是该 slice 中索引处的项目。由于您省略了第二个值,因此您是在索引上循环,而不是在 Note 值上循环。

它在规范的 RangeClause 部分:http://golang.org/ref/spec#RangeClause

关于mongodb - 使用 Go 检索 MongoDB 文档时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12558741/

相关文章:

java - MongoDB 通过 $in 命令获取匹配数

mongodb - 如何使用 go mongo-driver 在 MongoDB 中将 []byte 存储为二进制文件

go - 为什么我不能将此指针作为参数传递给其他函数?

go - 如何在go中添加时区以秒为单位获取时间

mongodb - 创建 session : no reachable servers - mgo

mongodb - 如何使用 mongo go 驱动程序而不是 Date(-62135596800000) 为日期字段分配空值

javascript - 存储图像的最佳选择是字节还是文件?

mongodb - MongoDB 文本索引的词干提取无法正常工作

用于匹配标签最后一次出现的正则表达式

mongodb - 需要帮助使用 golang 在我的 mongodb 数据库中存储类型接口(interface)的映射