Das Ergebnis eines MongoDB find()
ist immer eine Liste von Dokumenten. Wenn Sie also eine Liste mit Werten möchten, müssen Sie sie manuell konvertieren, genau wie Sie es getan haben.
Verwendung eines benutzerdefinierten Typs (abgeleitet von string
)
Beachten Sie auch, dass, wenn Sie Ihren eigenen Typ erstellen würden (abgeleitet von string
), könnten Sie seine Unmarshaling-Logik außer Kraft setzen und nur den username
„extrahieren“. aus dem Dokument.
So könnte es aussehen:
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
}
Und dann die Benutzernamen in einen Slice abfragen:
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)
Beachten Sie, dass []Username
ist nicht dasselbe wie []string
, daher kann dies für Sie ausreichen oder nicht. Sollten Sie einen Benutzernamen als Wert von string
benötigen statt Username
bei der Verarbeitung des Ergebnisses können Sie einfach einen Username
umwandeln zu string
.
Mit Query.Iter()
Eine andere Möglichkeit, das Kopieren von Slices zu vermeiden, wäre der Aufruf von Query.Iter()
, durchlaufen Sie die Ergebnisse und extrahieren und speichern Sie den username
manuell, ähnlich wie die obige benutzerdefinierte Unmarshaling-Logik.
So könnte es aussehen:
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)