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

Er der en måde at få udsnit som resultat af Find()?

Resultatet af en MongoDB find() er altid en liste over dokumenter. Så hvis du vil have en liste med værdier, skal du konvertere den manuelt, ligesom du gjorde.

Ved brug af en tilpasset type (afledt af string )

Bemærk også, at hvis du ville oprette din egen type (afledt af string ), kan du tilsidesætte dens unmarshaling-logik og "udtrække" kun username fra dokumentet.

Sådan kunne det se ud:

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
}

Og derefter forespørge brugernavnene i et udsnit:

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)

Bemærk, at []Username er ikke det samme som []string , så dette er måske eller måske ikke tilstrækkeligt for dig. Skulle du have brug for et brugernavn som værdi af string i stedet for Username når du behandler resultatet, kan du blot konvertere et Username til string .

Brug af Query.Iter()

En anden måde at undgå udsnitskopiering på ville være at kalde Query.Iter() , gentag resultaterne og udtræk og gem username manuelt, på samme måde som ovenstående brugerdefinerede unmarshaling-logik gør.

Sådan kunne det se ud:

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)



  1. MongoDB henter kun matchende underdokumenter fra et dokument med c#

  2. Mongodb-fejl:Positionsoperatøren fandt ikke det nødvendige match fra forespørgslen

  3. Gentager gennem en række strenge, hentet fra MongoDB

  4. Gør kombinationen af ​​to felter unik i min samling