El resultado de un MongoDB find()
es siempre una lista de documentos. Entonces, si desea una lista de valores, debe convertirla manualmente tal como lo hizo.
Usando un tipo personalizado (derivado de string
)
También tenga en cuenta que si creara su propio tipo (derivado de string
), puede anular su lógica de desarme y "extraer" solo el username
del documento.
Así es como podría verse:
type Username string
func (u *Username) SetBSON(raw bson.Raw) (err error) {
doc := bson.M{}
if err = raw.Unmarshal(&doc); err != nil {
return
}
*u = Username(doc["username"].(string))
return
}
Y luego consultar los nombres de usuario en una porción:
c := mongodb.DB("mybase").C("mycollection") // Obtain collection
var uns []Username
err = c.Find(nil).Select(bson.M{"username": 1, "_id": 0}).All(&uns)
if err != nil {
fmt.Println(err)
}
fmt.Println(uns)
Tenga en cuenta que []Username
no es lo mismo que []string
, por lo que esto puede o no ser suficiente para usted. Si necesita un nombre de usuario como valor de string
en lugar de Username
al procesar el resultado, simplemente puede convertir un Username
a string
.
Usando Query.Iter()
Otra forma de evitar la copia de segmentos sería llamar a Query.Iter()
, itere sobre los resultados y extraiga y almacene el username
manualmente, de manera similar a como lo hace la lógica de desclasificación personalizada anterior.
Así es como podría verse:
var uns []string
it := c.Find(nil).Select(bson.M{"username": 1, "_id": 0}).Iter()
defer it.Close()
for doc := (bson.M{}); it.Next(&doc); {
uns = append(uns, doc["username"].(string))
}
if err := it.Err(); err != nil {
fmt.Println(err)
}
fmt.Println(uns)