MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Gibt es eine Möglichkeit, Slice als Ergebnis von Find () zu erhalten?

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)