Výsledek MongoDB find()
je vždy seznam dokumentů. Pokud tedy chcete seznam hodnot, musíte jej převést ručně stejně jako vy.
Použití vlastního typu (odvozeného z string
)
Všimněte si také, že pokud byste vytvořili svůj vlastní typ (odvozený z string
), můžete přepsat jeho unmarshaling logiku a "extrahovat" pouze username
z dokumentu.
Takhle by to mohlo vypadat:
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
}
A pak dotazování na uživatelská jména do řezu:
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)
Všimněte si, že []Username
není totéž jako []string
, takže vám to může, ale nemusí stačit. Pokud potřebujete uživatelské jméno jako hodnotu string
místo Username
při zpracování výsledku můžete jednoduše převést Username
na string
.
Pomocí Query.Iter()
Dalším způsobem, jak se vyhnout kopírování řezu, by bylo zavolat Query.Iter()
, iterujte výsledky a extrahujte a uložte username
ručně, podobně jako výše uvedená vlastní logika unmarshalingu.
Takhle by to mohlo vypadat:
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)