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)