sql >> Databáze >  >> NoSQL >> MongoDB

Existuje způsob, jak získat řez jako výsledek Find()?

Výsledek MongoDB find() je vždy seznam dokumentů. Pokud tedy chcete seznam hodnot, musíte jej převést ručně stejně jako vy.

Použití vlastního typu (odvozeného z string )

Všimněte si také, že pokud byste vytvořili svůj vlastní typ (odvozený z string ), můžete přepsat jeho unmarshaling logiku a "extrahovat" pouze username z dokumentu.

Takhle by to mohlo vypadat:

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
}

A pak dotazování na uživatelská jména do řezu:

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)

Všimněte si, že []Username není totéž jako []string , takže vám to může, ale nemusí stačit. Pokud potřebujete uživatelské jméno jako hodnotu string místo Username při zpracování výsledku můžete jednoduše převést Username na string .

Pomocí Query.Iter()

Dalším způsobem, jak se vyhnout kopírování řezu, by bylo zavolat Query.Iter() , iterujte výsledky a extrahujte a uložte username ručně, podobně jako výše uvedená vlastní logika unmarshalingu.

Takhle by to mohlo vypadat:

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. Redis:Zobrazit velikost/velikost databáze pro klíče

  2. Spojujte a formátujte pole objektů v Pythonu

  3. Vkládání nových polí (sloupců) do mongoDB s pandami

  4. Jak se připojit k atlasu mongoDB pomocí mongoose