MongoDB cho phép truy vấn chính xác phần tử tại chỉ số cụ thể trong mảng bằng dot notation với chỉ số (ví dụ: array.0.field cho phần tử đầu tiên). Điều này hữu ích khi mảng đại diện cho danh sách có thứ tự ưu tiên.
Tạo dữ liệu mẫu
> db.matchingFirstItemInTheArrayDemo.insertOne(
{ "ClientDetails": [ { "ClientName": "Larry", "ClientAge":28 } ] }
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7a5d26d78f205348bc636") }
> db.matchingFirstItemInTheArrayDemo.insertOne(
{ "ClientDetails": [ { "ClientName": "Chris", "ClientAge":56 } ] }
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7a5f56d78f205348bc637") }
> db.matchingFirstItemInTheArrayDemo.insertOne(
{ "ClientDetails": [ { "ClientName": "Robert", "ClientAge":46 } ] }
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7a6076d78f205348bc638") }
Xem dữ liệu
> db.matchingFirstItemInTheArrayDemo.find().pretty();
Tìm tài liệu có phần tử đầu tiên ClientName = "Chris"
> db.matchingFirstItemInTheArrayDemo.find({"ClientDetails.0.ClientName":"Chris"});Kết quả
Giải thích
ClientDetails.0.ClientName: Truy cập trườngClientNamecủa phần tử tại chỉ số 0 (phần tử đầu tiên) trong mảngClientDetails- Chỉ số mảng trong MongoDB bắt đầu từ 0
- Chỉ khớp nếu phần tử đầu tiên thỏa mãn điều kiện
- Nếu mảng rỗng hoặc phần tử đầu không khớp → tài liệu không được trả về
Mở rộng: Truy vấn các vị trí khác
Kết hợp với $elemMatch (khi mảng có nhiều phần tử)
Nếu mảng có nhiều phần tử và muốn tìm bất kỳ phần tử nào khớp (không chỉ phần tử đầu):
So sánh
| Cú pháp | Ý nghĩa |
|---|---|
array.0.field | Chỉ kiểm tra phần tử đầu tiên (index 0) |
array.field | Kiểm tra TẤT CẢ phần tử (ít nhất 1 khớp) |
{array: {$elemMatch: {field: val}}} | Kiểm tra CÓ ÍT NHẤT 1 phần tử khớp (dùng cho điều kiện phức tạp trên cùng 1 phần tử) |
Ứng dụng thực tế
- Hàng đợi (queue): Xử lý item đầu tiên
- Lịch sử: Xem mục gần nhất (push vào đầu mảng)
- Ưu tiên: Phần tử đầu = ưu tiên cao nhất