Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

Return Type ของ db.collection.find() ใน MongoDB

db.collection.find() คืนค่า Cursor ไม่ใช่ Array หรือ Document

เมธอด find() ใน MongoDB ส่งคืน Cursor Object ซึ่งเป็น Pointer/Iterator ที่ชี้ไปที่ Result Set สามารถวนลูปหรือแปลงเป็น Array ได้

ตัวอย่างข้อมูล

> db.findCursorDemo.insertOne({"ClientFirstName":"John","ClientLastName":"Smith"});
> db.findCursorDemo.insertOne({"ClientFirstName":"Carol","ClientLastName":"Taylor"});
> db.findCursorDemo.insertOne({"ClientFirstName":"David","ClientLastName":"Miller"});

การใช้งาน Cursor

> var cursor = db.findCursorDemo.find();
> cursor
// คืนค่า Cursor Object (ไม่แสดงข้อมูล)

> cursor.hasNext()
true

> cursor.next()
{ "_id" : ObjectId("5cd00a1c588d4a6447b2e05c"), "ClientFirstName" : "John", "ClientLastName" : "Smith" }

> cursor.next()
{ "_id" : ObjectId("5cd00a26588d4a6447b2e05d"), "ClientFirstName" : "Carol", "ClientLastName" : "Taylor" }

Cursor Methods ที่นิยมใช้

Methodคำอธิบาย
hasNext()ตรวจสอบว่ายังมี Document ถัดไปหรือไม่
next()ดึง Document ถัดไป (Move Pointer)
forEach(fn)วนลูปทุก Document เรียก Function
toArray()แปลง Cursor เป็น Array (โหลดทั้งหมดใน Memory)
limit(n)จำกัดจำนวน Document
skip(n)ข้าม Document แรก n ตัว
sort({field: 1})เรียงลำดับ
count()นับจำนวน (Deprecated - ใช้ countDocuments() ใน Driver)

การใช้งานทั่วไป

// 1. พิมพ์ทั้งหมด (Shell)
db.findCursorDemo.find().forEach(printjson);

// 2. แปลงเป็น Array (ระวัง Memory)
var allDocs = db.findCursorDemo.find().toArray();

// 3. Pagination
var page1 = db.findCursorDemo.find().sort({_id:1}).skip(0).limit(10).toArray();
var page2 = db.findCursorDemo.find().sort({_id:1}).skip(10).limit(10).toArray();

// 4. Iterate แบบ Manual
var cursor = db.findCursorDemo.find();
while (cursor.hasNext()) {
    var doc = cursor.next();
    // process doc
}

ข้อสังเกตสำคัญ

  • Cursor เป็น Lazy - ไม่ Query จริงจนกว่าจะเรียก next() หรือ toArray()
  • Cursor Timeout: Default 10 นาที (Configurable)
  • ใน Driver (Node.js, Python, Java) - Cursor API คล้ายกันแต่เป็น Async/Iterator Pattern
  • findOne() = find().limit(1).next() คืนค่า Document โดยตรง (ไม่ใช่ Cursor)