Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cách lấy tài liệu đầu tiên trong collection MongoDB

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ứcTrả vềHiệu suấtSử dụng khi
findOne()Document (object) hoặc nullNhanh, dừng sau 1 matchCầ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();