บทความนี้สาธิตการใช้ $literal ใน Aggregation Pipeline เพื่อเพิ่มฟิลด์ที่มีค่าคงที่ (Static Value) ให้กับทุก Document ในผลลัพธ์ Query
สร้างข้อมูลตัวอย่าง
> db.fieldWithStaticValue.insertOne({"Name":"Larry","Age":24});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6554c7924bb85b3f48948") }
> db.fieldWithStaticValue.insertOne({"Name":"Chris","Age":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd655567924bb85b3f48949") }
> db.fieldWithStaticValue.insertOne({"Name":"David","Age":26});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd655607924bb85b3f4894a") }
แสดงข้อมูลต้นฉบับ
> db.fieldWithStaticValue.find();
{ "_id" : ObjectId("5cd6554c7924bb85b3f48948"), "Name" : "Larry", "Age" : 24 }
{ "_id" : ObjectId("5cd655567924bb85b3f48949"), "Name" : "Chris", "Age" : 23 }
{ "_id" : ObjectId("5cd655607924bb85b3f4894a"), "Name" : "David", "Age" : 26 }
เพิ่มฟิลด์ StaticValue = 100 ให้ทุก Document ด้วย $literal
> db.fieldWithStaticValue.aggregate([
{
$project: {
Name: 1,
Age: 1,
"StaticValue": { $literal: 100 }
}
}
]);
ผลลัพธ์
{ "_id" : ObjectId("5cd6554c7924bb85b3f48948"), "Name" : "Larry", "Age" : 24, "StaticValue" : 100 }
{ "_id" : ObjectId("5cd655567924bb85b3f48949"), "Name" : "Chris", "Age" : 23, "StaticValue" : 100 }
{ "_id" : ObjectId("5cd655607924bb85b3f4894a"), "Name" : "David", "Age" : 26, "StaticValue" : 100 }
คำอธิบาย $literal
{ $literal: <value> }- คืนค่า ตามตัวที่ระบุ โดยไม่ประเมิน (Evaluate) เป็น Expression- ใช้เมื่อต้องการใส่ค่าคงที่ เช่น ตัวเลข String Array Object ลงใน Pipeline
- จำเป็นเมื่อค่าที่ต้องการใส่ มีรูปแบบคล้าย Operator (เช่น
{ $gt: 10 }) เพื่อไม่ให้ MongoDB ตีความผิด
ตัวอย่างเพิ่มเติม: $literal กับ Array และ Object
db.collection.aggregate([
{ $project: {
tags: { $literal: ["tag1", "tag2", "tag3"] },
meta: { $literal: { source: "api", version: 1 } }
}}
]);
กรณีใช้งานจริง
- เพิ่ม Metadata เช่น
queryVersion,sourceSystemให้ทุก Record - กำหนด Default Value สำหรับ Field ที่อาจขาดหาย
- สร้าง Calculated Field ที่ต้องใช้ค่าคงที่ในสูตร