Trả về một document cụ thể với findOne()
findOne() trả về duy nhất 1 document khớp điều kiện (hoặc null nếu không có). Phù hợp lấy chi tiết, config, profile...
1. Dữ liệu: Object lồng details chứa tọa độ
> db.demo473.insertOne({
_id: new ObjectId(),
Name: "Chris",
details: { "X-Coordinate": 10, "Y-Coordinate": 15 }
});
> db.demo473.insertOne({
_id: new ObjectId(),
Name: "Bob",
details: { "X-Coordinate": 11, "Y-Coordinate": 12 }
});
2. Tìm document có X-Coordinate = 11
> db.demo473.findOne({ 'details.X-Coordinate': 11 });
3. Kết quả
{
"_id": ObjectId("5e805a07b0f3fa88e227907e"),
"Name": "Bob",
"details": { "X-Coordinate": 11, "Y-Coordinate": 12 }
}
Đặc điểm findOne()
- Trả về document object (không phải cursor)
- Trả về null nếu không tìm thấy
- Sử dụng natural order (thứ tự insert) nếu không sort
- Hỗ trợ projection param thứ 2
Ví dụ với projection
// Chỉ lấy Name và X-Coordinate
db.demo473.findOne(
{ 'details.X-Coordinate': 11 },
{ projection: { _id: 0, Name: 1, 'details.X-Coordinate': 1 } }
);
// { "Name": "Bob", "details": { "X-Coordinate": 11 } }
So sánh các phương thức "tìm 1"
| Phương thức | Trả về | Dùng khi |
|---|---|---|
| findOne(filter) | Doc / null | Cần dữ liệu ngay, logic đơn giản |
| findOne(filter, projection) | Doc / null | Cần giảm payload network |
| find(filter).limit(1) | Cursor | Cần sort, hoặc xử lý stream |
| findOneAndUpdate(...) | Doc (trước/sau) | Cần atomic read-modify-write |
| findOneAndDelete(...) | Doc đã xóa | Cần xử lý data vừa xóa |
| findOneAndReplace(...) | Doc (trước/sau) | Cần replace toàn bộ atomic |
Lưu ý hiệu suất
- Luôn tạo index cho trường filter:
db.demo473.createIndex({ "details.X-Coordinate": 1 }) - Tránh
findOne()trong loop (N+1 problem) → dùngfind()+toArray() - Với sharded cluster: filter phải chứa shard key để tránh scatter-gather