Trong MongoDB, việc tìm kiếm các tài liệu chứa giá trị cụ thể bên trong mảng các đối tượng (array of hashes) là một thao tác phổ biến. MongoDB hỗ trợ truy vấn trực tiếp vào các trường lồng nhau bằng cách sử dụng ký hiệu dấu chấm (dot notation).
Tạo dữ liệu mẫu
Trước tiên, hãy tạo một collection tên searchAnArrayDemo với các tài liệu chứa mảng TechnicalDetails:
> db.searchAnArrayDemo.insertOne({_id:1, "TechnicalDetails":[{"Language":"MongoDB"}]});
{ "acknowledged" : true, "insertedId" : 1 }
> db.searchAnArrayDemo.insertOne({_id:2, "TechnicalDetails":[{"Language":"MySQL"}]});
{ "acknowledged" : true, "insertedId" : 2 }
> db.searchAnArrayDemo.insertOne({_id:3, "TechnicalDetails":[{"Language":"MongoDB"}]});
{ "acknowledged" : true, "insertedId" : 3 }
> db.searchAnArrayDemo.insertOne({_id:4, "TechnicalDetails":[{"Language":"MongoDB"}]});
{ "acknowledged" : true, "insertedId" : 4 }
> db.searchAnArrayDemo.insertOne({_id:5, "TechnicalDetails":[{"Language":"Java"}]});
{ "acknowledged" : true, "insertedId" : 5 }
Xem tất cả tài liệu
Sử dụng phương thức find() kết hợp pretty() để hiển thị định dạng đẹp:
> db.searchAnArrayDemo.find().pretty();
Kết quả trả về:
{ "_id" : 1, "TechnicalDetails" : [ { "Language" : "MongoDB" } ] }
{ "_id" : 2, "TechnicalDetails" : [ { "Language" : "MySQL" } ] }
{ "_id" : 3, "TechnicalDetails" : [ { "Language" : "MongoDB" } ] }
{ "_id" : 4, "TechnicalDetails" : [ { "Language" : "MongoDB" } ] }
{ "_id" : 5, "TechnicalDetails" : [ { "Language" : "Java" } ] }
Truy vấn mảng đối tượng
Để tìm các tài liệu có Language bằng "MongoDB" bên trong mảng TechnicalDetails, sử dụng dot notation:
> db.searchAnArrayDemo.find({'TechnicalDetails.Language':'MongoDB'}).count();
Kết quả:
3
Giải thích
Cú pháp 'TechnicalDetails.Language' cho phép MongoDB duyệt qua từng phần tử trong mảng TechnicalDetails và kiểm tra trường Language. Đây là cách tiêu chuẩn để truy vấn các trường lồng nhau trong mảng đối tượng. Phương thức count() trả về số lượng tài liệu khớp với điều kiện.
Lưu ý: Từ phiên bản MongoDB 4.0+, phương thức count() trên cursor đã bị deprecated, nên sử dụng countDocuments() thay thế cho các truy vấn có điều kiện.