Giới thiệu
Để lấy tài liệu đầu tiên (theo thứ tự tự nhiên/insertion order) trong một collection, cách đơn giản và hiệu quả nhất là dùng phương thức findOne().
Cú pháp
// Trả về document đầu tiên (hoặc null nếu rỗng)
var doc = db.tenCollection.findOne();
// Có thể thêm filter
var doc = db.tenCollection.findOne({ trangThai: "active" });
Ví dụ minh họa
1. Tạo collection
> db.layDauTien.insertOne({ "TenKhachHang": "Robert", "TuoiKhachHang": 23 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ca2325966324ffac2a7dc6d") }
> db.layDauTien.insertOne({ "TenKhachHang": "Chris", "TuoiKhachHang": 26 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ca2326266324ffac2a7dc6e") }
> db.layDauTien.insertOne({ "TenKhachHang": "Larry", "TuoiKhachHang": 29 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ca2326a66324ffac2a7dc6f") }
> db.layDauTien.insertOne({ "TenKhachHang": "David", "TuoiKhachHang": 39 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ca2327566324ffac2a7dc70") }
2. Lấy document đầu tiên
> var docDauTien = db.layDauTien.findOne();
> docDauTien;
3. Kết quả
{ "_id" : ObjectId("5ca2325966324ffac2a7dc6d"), "TenKhachHang" : "Robert", "TuoiKhachHang" : 23 }
findOne() vs find().limit(1)
| Phương thức | Trả về | Hiệu suất | Sử dụng khi |
|---|---|---|---|
findOne() | Document (object) hoặc null | Nhanh, dừng sau 1 match | Cần 1 document, code đơn giản |
find().limit(1) | Cursor (có thể iterate) | Tương tự | Cần cursor methods (forEach, map...) |
⚠️ Lưu ý quan trọng: "Đầu tiên" không đảm bảo thứ tự
MongoDB không đảm bảo thứ tự trả về trừ khi bạn dùng sort().
- Thứ tự "tự nhiên" (natural order) thường theo thứ tự insert nhưng **không đảm bảo**
- Sau khi update/delete, thứ tự có thể thay đổi
- Sharded cluster: thứ tự phụ thuộc vào shard
Cách lấy document đầu tiên THEO THỨ TỰ CỤ THỂ
// Document được insert sớm nhất (theo _id ObjectId timestamp)
db.collection.find().sort({ _id: 1 }).limit(1);
// Document có createdAt sớm nhất
db.collection.find().sort({ createdAt: 1 }).limit(1);
// Document có giá trị lớn nhất
db.collection.find().sort({ diemSo: -1 }).limit(1);
Trong Aggregation
db.collection.aggregate([
{ $sort: { _id: 1 } },
{ $limit: 1 }
]);
Trong Application (Driver)
// Node.js
const doc = await collection.findOne(); // hoặc
const doc = await collection.find().sort({ _id: 1 }).limit(1).next();