mongodb go mgo

mongodb - No se puede recuperar el valor "_id" usando mgo con golang



(3)

Esta es la definición de mi estructura:

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

Este es el método que obtengo mis datos de la base de datos:

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

Este es un objeto almacenado en la base de datos:

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

Este es el resultado impreso:

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

Parece que no puedo obtener el valor real del campo _id , siempre es "" . ¿Cuál es el problema?


He encontrado el problema.

En el código:

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

entre json: y bson: usé una tab lugar de space para que se produzca el problema. Si cambio esta línea de código a:

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

Con un space entre json: y bson: resulta que funciona bien.


Tu código está bien.

Aquí hay un ejemplo autónomo que incluye su código, sin modificar:

Y aquí está la salida:

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

El problema está en otra parte. La colección puede no tener un campo _id , por ejemplo.


Tuve el mismo problema y pude darme cuenta de que había mezclado mis importaciones. Tengo la sensación de que Gustavo no pudo reproducir el problema porque no había incluido el aspecto de sus importaciones y las completó correctamente.

Solo para explicar brevemente cómo mi problema fue similar:

Esta -

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

no estaba funcionando para mí, no obtendría la información de la base de datos y devolvería esto-

{ObjectIdHex("") }

Como lo arregle ... encontramos que

En la página server.go, una de las importaciones fue esta.

"gopkg.in/mgo.v2”

Debería haber sido esto.

"labix.org/v2/mgo”

El error real no es el uso de gopkg.in/mgo.v2. Es que el código estaba mezclando los módulos de importación labix.org/ y gopkg.in.

Así que el truco es usar esto.

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

O esto.

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

Pero no los mezcles. El de arriba es el preferido, ya que es lo que usan los últimos documentos.

Espero que esto ayude.