Chương này giới thiệu cách sử dụng truy vấn tài liệu MongoDB trong Golang.
Các Bài Hướng Dẫn Tiên Quyết
Mẹo: Nếu bạn không quen với cú pháp truy vấn MongoDB, hãy đọc hướng dẫn MongoDB trước. Cú pháp biểu diễn được sử dụng cho các thao tác MongoDB trong Golang là giống nhau.
Chuẩn Bị Dữ Liệu Kiểm Tra
Chèn một lô dữ liệu tài liệu vào bộ sưu tập coll
.
docs := []interface{}{
bson.D{
{"item", "journal"},
{"qty", 25},
{"size", bson.D{
{"h", 14},
{"w", 21},
{"uom", "cm"},
}},
{"status", "A"},
},
// ... (dữ liệu tài liệu khác)
}
result, err := coll.InsertMany(context.Background(), docs)
Truy Vấn Tất Cả Các Tài Liệu
cursor, err := coll.Find(
context.Background(),
bson.D{}, // Đặt điều kiện truy vấn trống
)
Điều Kiện Truy Vấn Bẳng
Tương tự như truy vấn bằng của SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{{"status", "D"}}, // Điều kiện tương đương: status = D
)
Toán Tử Truy Vấn in
Tương tự như truy vấn in
của SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // Điều kiện tương đương: status in ('A', 'D')
Điều Kiện Truy Vấn and
Tương tự như biểu diễn logic and
của SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{ // Điều kiện tương đương: status='A' and qty < 30
{"status", "A"},
{"qty", bson.D{{"$lt", 30}}},
})
Điều Kiện Truy Vấn or
Tương tự như biểu diễn logic or
của SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{ // Điều kiện tương đương: status = "A" HOẶC qty < 30
{"$or", // Sử dụng toán tử $or
bson.A{ // Sử dụng định nghĩa kiểu mảng bson.A
bson.D{{"status", "A"}},
bson.D{{"qty", bson.D{{"$lt", 30}}}},
}},
})
Ví Dụ Truy Vấn Kết Hợp
cursor, err := coll.Find(
context.Background(),
bson.D{ // Điều kiện tương đương: status = "A" AND ( qty < 30 HOẶC item LIKE "p%")
{"status", "A"},
{"$or", bson.A{
bson.D{{"qty", bson.D{{"$lt", 30}}}},
bson.D{{"item", primitive.Regex{Pattern: "^p", Options: ""}}},
}},
})
Duyệt Kết Quả Truy Vấn
Ví Dụ 1
// Truy vấn tài liệu khi tên là 'Bob'
cursor, err := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if err != nil {
log.Fatal(err)
}
// Định nghĩa một mảng các tài liệu kiểu bson.M, trong đó bson.M là một cấu trúc dữ liệu khóa-giá giống như một bản đồ
var results []bson.M
// Sử dụng hàm All để lấy tất cả kết quả truy vấn và lưu kết quả vào biến kết quả.
if err = cursor.All(context.TODO(), &results); err != nil {
log.Fatal(err)
}
// Duyệt qua mảng kết quả
for _, result := range results {
fmt.Println(result)
}
Giải thích: Ví dụ sử dụng kiểu bson.M để lưu trữ dữ liệu tài liệu. Bạn có thể tùy chỉnh một kiểu cấu trúc phức tạp miễn là các trường phù hợp với tài liệu.
Ví Dụ 2
// Định nghĩa một biến kiểu cấu trúc để lưu kết quả truy vấn
var result struct {
Value float64
}
// Định nghĩa điều kiện truy vấn tài liệu name = 'pi'
filter := bson.D{{"name", "pi"}}
// Tạo một đối tượng ngữ cảnh và đặt thời gian chờ truy vấn là 5 giây
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Truy vấn một dữ liệu dựa trên điều kiện, và sử dụng hàm Decode để lưu kết quả vào biến kết quả
err = collection.FindOne(ctx, filter).Decode(&result)
// Kiểm tra lỗi truy vấn
if err == mongo.ErrNoDocuments {
// Tài liệu không được tìm thấy
fmt.Println("Tài liệu không tồn tại")
} else if err != nil {
log.Fatal(err)
}
// Xử lý khác
Mẹo: Đối với cú pháp biểu diễn truy vấn MongoDB phức tạp hơn, vui lòng tham khảo hướng dẫn MongoDB.