การเก็บผลลัพธ์ Query (เอกสารเดียว) ลงใน Variable ใน Mongo Shell
ใช้ var กำหนดตัวแปรรับค่าจาก find().limit(1) หรือ findOne() ใน Mongo Shell
ไวยากรณ์
var anyVariableName = db.yourCollectionName.find().limit(1);
yourVariableName; // พิมพ์ตัวแปรเพื่อดูผลลัพธ์
แนะนำ: ใช้ findOne() แทน find().limit(1) เพราะคืน Document โดยตรง (ไม่ใช่ Cursor)
ตัวอย่างการสร้างคอลเลกชันและเพิ่มข้อมูล
> db.storeQueryResultDemo.insertOne({"ClientName":"Chris","ClientAge":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ecf8fd628fa4220163b8d") }
> db.storeQueryResultDemo.insertOne({"ClientName":"Robert","ClientAge":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ecf97d628fa4220163b8e") }
> db.storeQueryResultDemo.insertOne({"ClientName":"Sam","ClientAge":25});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ecf9ed628fa4220163b8f") }
> db.storeQueryResultDemo.insertOne({"ClientName":"Mike","ClientAge":26});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ecfa8d628fa4220163b90") }
แสดงข้อมูลทั้งหมด
> db.storeQueryResultDemo.find().pretty();
ผลลัพธ์:
{ "_id" : ObjectId("5c9ecf8fd628fa4220163b8d"), "ClientName" : "Chris", "ClientAge" : 23 }
{ "_id" : ObjectId("5c9ecf97d628fa4220163b8e"), "ClientName" : "Robert", "ClientAge" : 21 }
{ "_id" : ObjectId("5c9ecf9ed628fa4220163b8f"), "ClientName" : "Sam", "ClientAge" : 25 }
{ "_id" : ObjectId("5c9ecfa8d628fa4220163b90"), "ClientName" : "Mike", "ClientAge" : 26 }
วิธีที่ 1: ใช้ find().limit(1) (คืน Cursor)
> var queryResult = db.storeQueryResultDemo.find().limit(1);
> queryResult;
{ "_id" : ObjectId("5c9ecf8fd628fa4220163b8d"), "ClientName" : "Chris", "ClientAge" : 23 }
หมายเหตุ: queryResult เป็น Cursor ต้อง Iterate หรือพิมพ์ตัวแปรใน Shell จะ Auto-iterate แสดงผล
วิธีที่ 2: ใช้ findOne() (แนะนำ - คืน Document โดยตรง)
> var doc = db.storeQueryResultDemo.findOne();
> doc;
{ "_id" : ObjectId("5c9ecf8fd628fa4220163b8d"), "ClientName" : "Chris", "ClientAge" : 23 }
วิธีที่ 3: ใช้ findOne() พร้อม Query Condition
> var specificDoc = db.storeQueryResultDemo.findOne({ "ClientName": "Sam" });
> specificDoc;
{ "_id" : ObjectId("5c9ecf9ed628fa4220163b8f"), "ClientName" : "Sam", "ClientAge" : 25 }
การเข้าถึง Field จาก Variable
> var doc = db.storeQueryResultDemo.findOne();
> doc.ClientName;
"Chris"
> doc.ClientAge;
23
> doc._id;
ObjectId("5c9ecf8fd628fa4220163b8d")
การใช้ Variable ใน Script/Update
> var doc = db.storeQueryResultDemo.findOne({ "ClientName": "Chris" });
> doc.ClientAge = 24; // แก้ไขค่าใน Variable
> db.storeQueryResultDemo.updateOne({ _id: doc._id }, { $set: { ClientAge: doc.ClientAge } });
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
ความแตกต่าง find().limit(1) vs findOne()
| คุณสมบัติ | find().limit(1) | findOne() |
|---|---|---|
| Return Type | Cursor | Document (หรือ null) |
| Iteration | ต้อง Iterate / Auto-print ใน Shell | เข้าถึง Field ได้ทันที |
| Performance | คล้ายกัน (ทั้งคู่ Stop หลังเจอ 1) | คล้ายกัน |
| ใช้ใน Script | ยุ่งยากกว่า (ต้อง .next()) | ง่ายกว่า |
| Null Handling | Cursor ว่าง (ไม่ Error) | คืน null (ต้อง Check) |
Best Practices
- ใช้ findOne() สำหรับดึง 1 Document ใน Script/Application
- ใช้ find().limit(1) เฉพาะใน Shell Interactive ที่ต้องการ Cursor Methods
- ตรวจสอบ
nullเสมอก่อนเข้าถึง Field:if (doc) { print(doc.name); } - ใน Application Driver: ใช้
findOne()หรือfind().limit(1).next()
ตัวอย่างการใช้ใน Loop (Shell Script)
var ids = [ObjectId("..."), ObjectId("..."), ObjectId("...")];
ids.forEach(function(id) {
var doc = db.collection.findOne({ _id: id });
if (doc) {
print("Processing: " + doc.name);
// ทำงานกับ doc
}
});