sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Hay alguna forma de obtener un segmento como resultado de Find ()?

El resultado de un MongoDB find() es siempre una lista de documentos. Entonces, si desea una lista de valores, debe convertirla manualmente tal como lo hizo.

Usando un tipo personalizado (derivado de string )

También tenga en cuenta que si creara su propio tipo (derivado de string ), puede anular su lógica de desarme y "extraer" solo el username del documento.

Así es como podría verse:

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
}

Y luego consultar los nombres de usuario en una porción:

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)

Tenga en cuenta que []Username no es lo mismo que []string , por lo que esto puede o no ser suficiente para usted. Si necesita un nombre de usuario como valor de string en lugar de Username al procesar el resultado, simplemente puede convertir un Username a string .

Usando Query.Iter()

Otra forma de evitar la copia de segmentos sería llamar a Query.Iter() , itere sobre los resultados y extraiga y almacene el username manualmente, de manera similar a como lo hace la lógica de desclasificación personalizada anterior.

Así es como podría verse:

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)