MongoDB hỗ trợ truy vấn trực tiếp vào các phần tử bên trong mảng một cách tự nhiên và mạnh mẽ. Bạn không cần $elemMatch cho các điều kiện đơn giản.
Cú pháp cơ bản
db.collection.find({ "trườngMảng": "giáTrịCầnTìm" }).pretty();
Truy vấn này trả về tất cả document mà mảng trườngMảng chứa giáTrịCầnTìm.
Ví dụ minh họa
Tạo collection queryArrayElementsDemo với mảng StudentFavouriteSubject:
> db.queryArrayElementsDemo.insertOne({ "StudentName": "John", "StudentFavouriteSubject": ["C", "Java"] });
> db.queryArrayElementsDemo.insertOne({ "StudentName": "Carol", "StudentFavouriteSubject": ["C", "C++"] });
> db.queryArrayElementsDemo.insertOne({ "StudentName": "David", "StudentFavouriteSubject": ["MongoDB", "Java"] });
Hiển thị tất cả:
> db.queryArrayElementsDemo.find().pretty();
Kết quả:
{ "_id" : ..., "StudentName" : "John", "StudentFavouriteSubject" : [ "C", "Java" ] }
{ "_id" : ..., "StudentName" : "Carol", "StudentFavouriteSubject" : [ "C", "C++" ] }
{ "_id" : ..., "StudentName" : "David", "StudentFavouriteSubject" : [ "MongoDB", "Java" ] }
Truy vấn sinh viên thích môn "Java"
> db.queryArrayElementsDemo.find({ "StudentFavouriteSubject": "Java" }).pretty();
Kết quả:
{ "_id" : ..., "StudentName" : "John", "StudentFavouriteSubject" : [ "C", "Java" ] }
{ "_id" : ..., "StudentName" : "David", "StudentFavouriteSubject" : [ "MongoDB", "Java" ] }
Các toán tử nâng cao cho mảng
| Toán tử | Mô tả | Ví dụ |
|---|---|---|
$all | Mảng chứa TẤT CẢ các giá trị chỉ định | { tags: { $all: ["nodejs", "mongodb"] } } |
$size | Mảng có độ dài chính xác | { tags: { $size: 3 } } |
$elemMatch | Khớp nhiều điều kiện trên CÙNG MỘT phần tử (dùng cho mảng object) | { items: { $elemMatch: { price: { $gt: 10 }, qty: { $lt: 5 } } } } |
$in | Mảng chứa ÍT NHẤT MỘT giá trị trong danh sách | { tags: { $in: ["java", "python"] } } |
$nin | Mảng KHÔNG chứa giá trị nào trong danh sách | { tags: { $nin: ["deprecated"] } } |
Mẹo: Tạo index trên trường mảng (db.coll.createIndex({ "tags": 1 })) để tăng tốc truy vấn. MongoDB sẽ tạo multikey index tự động.