Phương thức findOne() kết hợp với ObjectId là cách hiệu quả nhất để truy xuất một tài liệu duy nhất theo khóa chính (_id) trong MongoDB.
Tạo dữ liệu mẫu
> db.findOneWorkingDemo.insertOne({"ClientId":1,"ClientName":"Larry","ClientAge":26});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7c1716d78f205348bc64d") }
> db.findOneWorkingDemo.insertOne({"ClientId":2,"ClientName":"Chris","ClientAge":28});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7c17d6d78f205348bc64e") }
> db.findOneWorkingDemo.insertOne({"ClientId":3,"ClientName":"Robert","ClientAge":34});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7c1896d78f205348bc64f") }
Xem dữ liệu
> db.findOneWorkingDemo.find().pretty();
Truy xuất với findOne() và ObjectId
> db.findOneWorkingDemo.findOne({"_id": ObjectId("5cd7c17d6d78f205348bc64e")});Kết quả
Giải thích
findOne(): Trả về một tài liệu đầu tiên khớp (hoặc null nếu không có)ObjectId("..."): Constructor tạo ObjectId từ chuỗi 24 ký tự hex- _id là khóa chính, có index duy nhất (unique index) mặc định → truy vấn cực nhanh O(1)
- Khác với
find()trả về cursor,findOne()trả về document trực tiếp
So sánh findOne() vs find()
| Đặc điểm | findOne() | find() |
|---|---|---|
| Trả về | Document hoặc null | Cursor |
| Hiệu năng | Dừng sau 1 match | Chuẩn bị cursor |
| Sử dụng | Lấy 1 doc theo _id | Lấy nhiều doc, cần duyệt |
| Projection | Hỗ trợ | Hỗ trợ |
Các cách sử dụng findOne() với ObjectId
1. Từ chuỗi string
2. Với projection (chỉ lấy trường cần)
3. Trong ứng dụng (Node.js)
var doc = db.findOneWorkingDemo.findOne({_id: ObjectId("...")}); if (doc) { print("Found: " + doc.ClientName); } else { print("Not found"); }Lấy timestamp từ ObjectId
Lưu ý
- Luôn dùng
ObjectId()constructor, không so sánh string trực tiếp:{_id: "5cd7c17d..."}sẽ không khớp - ObjectId tự động sinh khi insert nếu không cung cấp _id
- ObjectId tăng dần theo thời gian → có thể dùng để sort theo thời gian tạo
- findOne() không hỗ trợ skip/limit (luôn trả về doc đầu tiên)