MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Existe uma maneira de obter fatia como resultado de Find ()?


O resultado de um find() do MongoDB é sempre uma lista de documentos. Portanto, se você deseja uma lista de valores, precisa convertê-la manualmente, assim como fez.

Usando um tipo personalizado (derivado de string )


Observe também que se você criar seu próprio tipo (derivado de string ), você pode substituir sua lógica de unmarshaling e "extrair" apenas o username do documento.

É assim que pode ficar:
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, em seguida, consultando os nomes de usuário em uma fatia:
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)

Observe que []Username não é o mesmo que []string , então isso pode ou não ser suficiente para você. Se você precisar de um nome de usuário como um valor de string em vez de Username ao processar o resultado, você pode simplesmente converter um Username para string .

Usando Query.Iter()


Outra maneira de evitar a cópia da fatia seria chamar Query.Iter() , itere sobre os resultados e extraia e armazene o username manualmente, da mesma forma que a lógica de unmarshaling personalizada acima faz.

É assim que pode ficar:
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)