MongoDB का परिणाम find()
हमेशा दस्तावेजों की एक सूची है। इसलिए यदि आप मानों की एक सूची चाहते हैं, तो आपको इसे मैन्युअल रूप से वैसे ही बदलना होगा जैसे आपने किया था।
कस्टम प्रकार का उपयोग करना (string
. से व्युत्पन्न) )
यह भी ध्यान दें कि यदि आप अपना खुद का प्रकार (string
. से व्युत्पन्न) बनाएंगे ), आप इसके अनमर्शलिंग लॉजिक को ओवरराइड कर सकते हैं, और केवल username
. को "एक्सट्रेक्ट" कर सकते हैं दस्तावेज़ से।
यह इस तरह दिख सकता है:
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
}
और फिर उपयोगकर्ता नामों को एक स्लाइस में क्वेरी करना:
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)
ध्यान दें कि []Username
[]string
. के समान नहीं है , तो यह आपके लिए पर्याप्त हो भी सकता है और नहीं भी। क्या आपको string
. के मान के रूप में उपयोगकर्ता नाम की आवश्यकता है? username
. के बजाय परिणाम संसाधित करते समय, आप बस एक username
. को रूपांतरित कर सकते हैं करने के लिए string
।
Query.Iter()
का उपयोग करना
स्लाइस कॉपी करने से बचने का एक और तरीका यह होगा कि Query.Iter()
, परिणामों पर पुनरावृति करें और username
. निकालें और संग्रहीत करें मैन्युअल रूप से, इसी तरह उपरोक्त कस्टम अनमर्शलिंग लॉजिक कैसे करता है।
यह इस तरह दिख सकता है:
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)