Resultatet af en MongoDB find()
er altid en liste over dokumenter. Så hvis du vil have en liste med værdier, skal du konvertere den manuelt, ligesom du gjorde.
Ved brug af en tilpasset type (afledt af string
)
Bemærk også, at hvis du ville oprette din egen type (afledt af string
), kan du tilsidesætte dens unmarshaling-logik og "udtrække" kun username
fra dokumentet.
Sådan kunne det se ud:
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
}
Og derefter forespørge brugernavnene i et udsnit:
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)
Bemærk, at []Username
er ikke det samme som []string
, så dette er måske eller måske ikke tilstrækkeligt for dig. Skulle du have brug for et brugernavn som værdi af string
i stedet for Username
når du behandler resultatet, kan du blot konvertere et Username
til string
.
Brug af Query.Iter()
En anden måde at undgå udsnitskopiering på ville være at kalde Query.Iter()
, gentag resultaterne og udtræk og gem username
manuelt, på samme måde som ovenstående brugerdefinerede unmarshaling-logik gør.
Sådan kunne det se ud:
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)