MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Existe-t-il un moyen d'obtenir une tranche à la suite de Find () ?

Le résultat d'un MongoDB find() est toujours une liste de documents. Donc, si vous voulez une liste de valeurs, vous devez la convertir manuellement comme vous l'avez fait.

Utiliser un type personnalisé (dérivé de string )

Notez également que si vous créez votre propre type (dérivé de string ), vous pouvez remplacer sa logique de désassemblage et "extraire" uniquement le username du document.

Voici à quoi cela pourrait ressembler :

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
}

Et puis en interrogeant les noms d'utilisateur dans une tranche :

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)

Notez que []Username n'est pas identique à []string , cela peut donc vous suffire ou non. Si vous avez besoin d'un nom d'utilisateur comme valeur de string au lieu de Username lors du traitement du résultat, vous pouvez simplement convertir un Username à string .

Utiliser Query.Iter()

Une autre façon d'éviter la copie de tranches serait d'appeler Query.Iter() , parcourez les résultats et extrayez et stockez le username manuellement, de la même manière que la logique de désorganisation personnalisée ci-dessus.

Voici à quoi cela pourrait ressembler :

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)