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

Sử dụng ObjectId với findOne() để lấy bản ghi cụ thể trong MongoDB

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ểmfindOne()find()
Trả vềDocument hoặc nullCursor
Hiệu năngDừng sau 1 matchChuẩn bị cursor
Sử dụngLấy 1 doc theo _idLấy nhiều doc, cần duyệt
ProjectionHỗ 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)