MongoDB的结果
find()始终是文档列表。因此,如果要获取值列表,则必须像以前一样手动将其转换。
使用自定义类型(源自string
)
另外请注意,如果您要创建自己的类型(从派生
string),则可以覆盖其取消编组逻辑,并
username仅从文档中“提取” 。
它看起来像这样:
type Username stringfunc (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 collectionvar uns []Usernameerr = 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在处理结果时,只需将a转换为
Username即可
string。
使用 Query.Iter()
避免切片复制的另一种方法是调用
Query.Iter(),迭代结果并
username手动提取和存储,类似于上述自定义编组逻辑的工作方式。
它看起来像这样:
var uns []stringit := 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)


