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

Hàm MongoDB trả về dữ liệu/giá trị cụ thể: findOne()

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ứcTrả vềDùng khi
findOne(filter)Doc / nullCần dữ liệu ngay, logic đơn giản
findOne(filter, projection)Doc / nullCần giảm payload network
find(filter).limit(1)CursorCần sort, hoặc xử lý stream
findOneAndUpdate(...)Doc (trước/sau)Cần atomic read-modify-write
findOneAndDelete(...)Doc đã xóaCầ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ùng find() + toArray()
  • Với sharded cluster: filter phải chứa shard key để tránh scatter-gather