Le résultat d'un MongoDB find()
est toujours une liste de documents. Donc, si vous voulez une liste de valeurs, vous devez la convertir manuellement comme vous l'avez fait.
Utiliser un type personnalisé (dérivé de string
)
Notez également que si vous créez votre propre type (dérivé de string
), vous pouvez remplacer sa logique de désassemblage et "extraire" uniquement le username
du document.
Voici à quoi cela pourrait ressembler :
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
}
Et puis en interrogeant les noms d'utilisateur dans une tranche :
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)
Notez que []Username
n'est pas identique à []string
, cela peut donc vous suffire ou non. Si vous avez besoin d'un nom d'utilisateur comme valeur de string
au lieu de Username
lors du traitement du résultat, vous pouvez simplement convertir un Username
à string
.
Utiliser Query.Iter()
Une autre façon d'éviter la copie de tranches serait d'appeler Query.Iter()
, parcourez les résultats et extrayez et stockez le username
manuellement, de la même manière que la logique de désorganisation personnalisée ci-dessus.
Voici à quoi cela pourrait ressembler :
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)