MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

C'è un modo per ottenere la fetta come risultato di Find()?

Il risultato di un MongoDB find() è sempre un elenco di documenti. Quindi, se vuoi un elenco di valori, devi convertirlo manualmente proprio come hai fatto.

Utilizzo di un tipo personalizzato (derivato da string )

Nota anche che se dovessi creare il tuo tipo (derivato da string ), potresti ignorare la sua logica di unmarshalling ed "estrarre" solo il username dal documento.

Ecco come potrebbe apparire:

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
}

E quindi interrogare i nomi utente in una sezione:

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)

Nota che []Username non è uguale a []string , quindi questo potrebbe o non potrebbe essere sufficiente per te. Se hai bisogno di un nome utente come valore di string invece di Username durante l'elaborazione del risultato, puoi semplicemente convertire un Username a string .

Utilizzo di Query.Iter()

Un altro modo per evitare la copia della sezione sarebbe chiamare Query.Iter() , scorrere i risultati ed estrarre e archiviare il username manualmente, in modo simile a come funziona la logica di unmarshaling personalizzata sopra.

Ecco come potrebbe apparire:

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)