Hasil dari find()
Mon MongoDB selalu daftar dokumen. Jadi, jika Anda menginginkan daftar nilai, Anda harus mengonversinya secara manual seperti yang Anda lakukan.
Menggunakan tipe khusus (berasal dari string
)
Perhatikan juga bahwa jika Anda ingin membuat jenis Anda sendiri (berasal dari string
), Anda dapat mengganti logika unmarshalingnya, dan "mengekstrak" username
saja dari dokumen.
Seperti inilah tampilannya:
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
}
Dan kemudian menanyakan nama pengguna menjadi irisan:
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)
Perhatikan bahwa []Username
tidak sama dengan []string
, jadi ini mungkin atau mungkin tidak cukup untuk Anda. Jika Anda memerlukan nama pengguna sebagai nilai string
bukannya Username
saat memproses hasilnya, Anda cukup mengonversi Username
ke string
.
Menggunakan Query.Iter()
Cara lain untuk menghindari penyalinan irisan adalah dengan memanggil Query.Iter()
, ulangi hasil dan ekstrak dan simpan username
secara manual, sama seperti logika unmarshaling kustom di atas.
Seperti inilah tampilannya:
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)