Để lấy một phần tử cụ thể từ mảng kết quả theo chỉ số (index), bạn có thể sử dụng Pipeline Aggregation với các stage $match, $skip và $limit. Phương pháp này hữu ích khi cần phân trang hoặc truy xuất bản ghi tại vị trí xác định.
1. Tạo bộ sưu tập và chèn dữ liệu mẫu
> db.demo391.insertOne({ "_id": 101, "Name": "Chris", "Values": ["101", "102"] })
{ "acknowledged": true, "insertedId": 101 }
> db.demo391.insertOne({ "_id": 111, "Name": "Chris", "Values": ["101", "102"] })
{ "acknowledged": true, "insertedId": 111 }
> db.demo391.insertOne({ "_id": 121, "Name": "Chris", "Values": ["101", "102"] })
{ "acknowledged": true, "insertedId": 121 }
2. Xem dữ liệu ban đầu
> db.demo391.find();
Kết quả:
{ "_id": 101, "Name": "Chris", "Values": ["101", "102"] }
{ "_id": 111, "Name": "Chris", "Values": ["101", "102"] }
{ "_id": 121, "Name": "Chris", "Values": ["101", "102"] }
3. Truy vấn lấy phần tử tại chỉ số 2 (phần tử thứ 3)
Sử dụng biến i để chỉ định vị trí, kết hợp $skip để bỏ qua i-1 bản ghi đầu và $limit: 1 để lấy 1 bản ghi:
> var i = 2;
> db.demo391.aggregate([
{ $match: { "Name": "Chris" } },
{ $skip: i - 1 },
{ $limit: 1 }
]);
4. Kết quả
{ "_id": 111, "Name": "Chris", "Values": ["101", "102"] }
Giải thích: Với i = 2, $skip: 1 sẽ bỏ qua bản ghi đầu tiên (_id: 101) và trả về bản ghi thứ hai (_id: 111). Cách này thường dùng cho phân trang (pagination) kết quả truy vấn.