Resultatet av en MongoDB find()
är alltid en lista över dokument. Så om du vill ha en lista med värden måste du konvertera den manuellt precis som du gjorde.
Med en anpassad typ (härledd från string
)
Observera också att om du skulle skapa din egen typ (härledd från string
), kan du åsidosätta dess unmarshaling-logik och "extrahera" bara username
från dokumentet.
Så här kan det se ut:
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
}
Och sedan fråga användarnamnen till en del:
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)
Observera att []Username
är inte detsamma som []string
, så detta kanske eller kanske inte är tillräckligt för dig. Om du behöver ett användarnamn som ett värde på string
istället för Username
när du bearbetar resultatet kan du helt enkelt konvertera ett Username
till string
.
Med Query.Iter()
Ett annat sätt att undvika skivkopiering är att anropa Query.Iter()
, iterera över resultaten och extrahera och lagra username
manuellt, på samma sätt som ovanstående anpassade unmarshaling-logik gör.
Så här kan det se ut:
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)