Để truy vấn giá trị đơn giản trong mảng (không phải object), sử dụng positional operator ($) trong projection.
Tạo collection với mảng chuỗi
> db.demo628.insertOne({id:1, Name:["Chris","David","John"]});
> db.demo628.insertOne({id:1, Name:["Carol","Sam"]});
> db.demo628.insertOne({id:2, Name:["Mike","Sam","John"]});
Hiển thị tất cả
> db.demo628.find();
Kết quả:
{
"_id" : ObjectId("5e9ae7ea6c954c74be91e6b6"),
"id" : 1, "Name" : [ "Chris", "David", "John" ]
}
{
"_id" : ObjectId("5e9ae7f26c954c74be91e6b7"),
"id" : 1, "Name" : [ "Carol", "Sam" ]
}
{
"_id" : ObjectId("5e9ae8056c954c74be91e6b8"),
"id" : 2, "Name" : [ "Mike", "Sam", "John" ]
}
Truy vấn tìm "John" và chỉ trả về phần tử khớp
> db.demo628.find({ "Name": "John" }, { "id": 1, "Name.$": 1 });
Kết quả (chỉ giữ "John" trong mảng Name):
{
"_id" : ObjectId("5e9ae7ea6c954c74be91e6b6"),
"id" : 1, "Name" : [ "John" ]
}
{
"_id" : ObjectId("5e9ae8056c954c74be91e6b8"),
"id" : 2, "Name" : [ "John" ]
}
Giải thích:
- Điều kiện
{ "Name": "John" }tìm document có "John" trong mảng - Projection
{ "Name.$": 1 }dùng positional operator$để chỉ trả về **phần tử đầu tiên** khớp điều kiện trong mảng - Document thứ 2 (Carol, Sam) không có "John" → không xuất hiện trong kết quả
Lưu ý: Positional operator $ chỉ trả về **một** phần tử khớp đầu tiên. Nếu cần tất cả phần tử khớp, dùng $elemMatch trong projection hoặc $filter trong aggregate (MongoDB 3.2+).