Il risultato di un MongoDB find()
è sempre un elenco di documenti. Quindi, se vuoi un elenco di valori, devi convertirlo manualmente proprio come hai fatto.
Utilizzo di un tipo personalizzato (derivato da string
)
Nota anche che se dovessi creare il tuo tipo (derivato da string
), potresti ignorare la sua logica di unmarshalling ed "estrarre" solo il username
dal documento.
Ecco come potrebbe apparire:
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
}
E quindi interrogare i nomi utente in una sezione:
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)
Nota che []Username
non è uguale a []string
, quindi questo potrebbe o non potrebbe essere sufficiente per te. Se hai bisogno di un nome utente come valore di string
invece di Username
durante l'elaborazione del risultato, puoi semplicemente convertire un Username
a string
.
Utilizzo di Query.Iter()
Un altro modo per evitare la copia della sezione sarebbe chiamare Query.Iter()
, scorrere i risultati ed estrarre e archiviare il username
manualmente, in modo simile a come funziona la logica di unmarshaling personalizzata sopra.
Ecco come potrebbe apparire:
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)