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.