Резултатът от MongoDB find()
винаги е списък с документи. Така че, ако искате списък със стойности, трябва да го конвертирате ръчно, както направихте.
Използване на персонализиран тип (извлечен от string
)
Също така имайте предвид, че ако създадете свой собствен тип (извлечен от string
), бихте могли да замените логиката му за демаршалиране и да „извлечете“ само username
от документа.
Ето как може да изглежда:
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
}
И след това заявка за потребителските имена в срез:
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)
Имайте предвид, че []Username
не е същото като []string
, така че това може или не може да е достатъчно за вас. Ако имате нужда от потребителско име като стойност на string
вместо Username
когато обработвате резултата, можете просто да конвертирате Username
към string
.
Използване на Query.Iter()
Друг начин да избегнете копирането на срез би бил да извикате Query.Iter()
, итерирайте резултатите и извлечете и съхранете username
ръчно, подобно на горната персонализирана логика за демаршалиране.
Ето как може да изглежда:
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)