Kết quả của một MongoDB find()
luôn luôn là một danh sách các tài liệu. Vì vậy, nếu bạn muốn có một danh sách các giá trị, bạn phải chuyển đổi nó theo cách thủ công giống như cách bạn đã làm.
Sử dụng loại tùy chỉnh (bắt nguồn từ string
)
Cũng lưu ý rằng nếu bạn muốn tạo kiểu của riêng mình (bắt nguồn từ string
), bạn có thể ghi đè lôgic giải nén của nó và chỉ "trích xuất" username
từ tài liệu.
Đây là cách nó có thể trông như thế này:
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
}
Và sau đó truy vấn tên người dùng thành một phần:
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)
Lưu ý rằng []Username
không giống với []string
, vì vậy điều này có thể đủ hoặc có thể không đủ đối với bạn. Nếu bạn cần tên người dùng làm giá trị của string
thay vì Username
khi xử lý kết quả, bạn có thể chỉ cần chuyển đổi Username
thành string
.
Sử dụng Query.Iter()
Một cách khác để tránh sao chép lát cắt là gọi Query.Iter()
, lặp lại các kết quả và trích xuất và lưu trữ username
theo cách thủ công, tương tự như cách logic bỏ phân tích tùy chỉnh ở trên hoạt động.
Đây là cách nó có thể trông như thế này:
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)