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)