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

วิธีเก็บผลลัพธ์ Query (เอกสารเดียว) ลงใน Variable ใน MongoDB

การเก็บผลลัพธ์ 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 TypeCursorDocument (หรือ null)
Iterationต้อง Iterate / Auto-print ใน Shellเข้าถึง Field ได้ทันที
Performanceคล้ายกัน (ทั้งคู่ Stop หลังเจอ 1)คล้ายกัน
ใช้ใน Scriptยุ่งยากกว่า (ต้อง .next())ง่ายกว่า
Null HandlingCursor ว่าง (ไม่ 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
    }
});