无法使用golang的mgo库检索"_id"值

22

这是我的结构体定义:

type Article struct {
    Id      bson.ObjectId `json:"id"        bson:"_id,omitempty"`
    Title   string        `json:"title"`
    Author  string        `json:"author"`
    Date    string        `json:"date"`
    Tags    string        `json:"tags"`
    Content string        `json:"content"`
    Status  string        `json:"status"`
}

这是我从数据库中获取数据的方法:

func AllArticles() []Article {
    articles := []Article{}
    err := c_articles.Find(bson.M{}).All(&articles)
    if err != nil {
        panic(err)
    }

    return articles
}

这是数据库中存储的一个对象:

{ "_id" : ObjectId( "5281b83afbb7f35cb62d0834" ),
  "title" : "Hello1",
  "author" : "DYZ",
  "date" : "2013-11-10",
  "tags" : "abc",
  "content" : "This is another content.",
  "status" : "published" }

这是打印出来的结果:

[{ObjectIdHex("") Hello1 DYZ 2013-11-10 abc This is another content. published}     {ObjectIdHex("") Hello2 DYZ 2013-11-14 abc This is the content. published}]

看起来我无法获得_id字段的真实值,它总是""。问题出在哪里?

3个回答

44
我已经找到问题所在。
在代码中:
Id      bson.ObjectId `json:"id"        bson:"_id,omitempty"`

json:bson:之间,我使用了制表符而不是空格,因此出现了问题。如果我将这行代码更改为:

Id      bson.ObjectId `json:"id" bson:"_id,omitempty"`

json:bson: 之间有一个space,这样它就可以正常工作。


我简直不敢相信,我花了整个下午来修复一个奇怪的错误,好找到! - rendon
哈哈,问题解决了 - 有点“容易陷入问题”的感觉 - Oskar Szura
2
使用像Atom或Visual Studio这样的工具,可以指出这个错误! - Naren Yellavula
我已经花了几个小时来尝试解决这个问题,这是我必须为自己记录的事情。谢谢。 - kiran kumar
哇 - 花了很多时间来调试这个问题。我需要补充说明,: 后面不允许有空格,例如 json: "id" bson: "_id" 是无效的,因为在 :" 之间有一个空格。我必须更正我的代码为 json:"_id" bson:"_id" - Taimoor Ahmad

9

我曾经遇到过同样的问题,后来发现是我的导入混乱了。我猜测 Gustavo 没有复现这个问题是因为你没有包含你的导入信息,而他填写了正确的导入。

简要解释一下我的问题如何类似:

这是 -

err := db.Find(bson.M{"_id": bson.ObjectIdHex(userId)}).One(&user)

对我来说不起作用,它无法从数据库中获取信息,并返回以下内容-

{ObjectIdHex("")    }

我如何解决它...我们发现在server.go页面中,其中一个引入是这样的。
"gopkg.in/mgo.v2”

应该是这样的。
"labix.org/v2/mgo”

真正的问题不是使用gopkg.in/mgo.v2,而是代码混合使用了labix.org/和gopkg.in的导入模块。
因此,解决方法是使用以下内容。
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson”

或者这个。

"labix.org/v2/mgo"
"labix.org/v2/mgo/bson”

但不要混淆它们。顶部的是首选,因为最新的文档使用它。希望这可以帮到你。

3

你的代码是没有问题的。

这里有一个自包含的例子,包括你的代码,未经修改:

以下是输出结果:

"R\x94\xa4J\xff&\xc61\xc7\xfd%\xcc" "Some Title"

问题在别处。例如,该集合可能真的没有_id字段。

我认为 _id 是每个对象的默认字段,不是吗? - dyzdyz010
如上所述,我已经使用您的代码提供了一个“可工作的示例”,因此它本身没有问题。我们不能修复没有问题的东西。如果您提供一个自包含的反例来展示它无法工作,那么有人可以尝试帮助您。 - Gustavo Niemeyer

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