ใช้ $literal เพื่อตั้งค่าคงที่ (String Literal) ใน Aggregation Projection
บทความนี้สาธิตการใช้งานออปเจอเตอร์ $literal ในขั้นตอน $project ของ Aggregation Pipeline เพื่อแทนที่ค่าของฟิลด์ด้วยค่าคงที่ (String Literal) ที่ระบุไว้
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
> db.replacevaluedemo.insertOne({"StudentName":"Chris","StudentFavouriteSubject":{"TeacherName":"Bob","SubjectCode":"MySQL111"}});
{ "acknowledged": true, "insertedId": ObjectId("5e0390a3f5e889d7a51994fd") }
> db.replacevaluedemo.insertOne({"StudentName":"Mike","StudentFavouriteSubject":{"TeacherName":"David","SubjectCode":"3221Java"}});
{ "acknowledged": true, "insertedId": ObjectId("5e0390b8f5e889d7a51994fe") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.replacevaluedemo.find().pretty();
ผลลัพธ์:
{ "_id": ObjectId("5e0390a3f5e889d7a51994fd"), "StudentName": "Chris", "StudentFavouriteSubject": { "TeacherName": "Bob", "SubjectCode": "MySQL111" } }
{ "_id": ObjectId("5e0390b8f5e889d7a51994fe"), "StudentName": "Mike", "StudentFavouriteSubject": { "TeacherName": "David", "SubjectCode": "3221Java" } }
ขั้นตอนที่ 3: ใช้ $project พร้อม $literal
เก็บ SubjectCode เดิม แต่แทนที่ TeacherName ด้วย String Literal "UNKNOWN NAME"
> db.replacevaluedemo.aggregate([
{ "$project": {
"_id": 1,
"StudentFavouriteSubject": {
"SubjectCode": 1,
"TeacherName": { $literal: "UNKNOWN NAME" }
}
}}
]).pretty();
ผลลัพธ์ที่ได้
{ "_id": ObjectId("5e0390a3f5e889d7a51994fd"), "StudentFavouriteSubject": { "SubjectCode": "MySQL111", "TeacherName": "UNKNOWN NAME" } }
{ "_id": ObjectId("5e0390b8f5e889d7a51994fe"), "StudentFavouriteSubject": { "SubjectCode": "3221Java", "TeacherName": "UNKNOWN NAME" } }
สรุป: $literal มีประโยชน์เมื่อต้องการใส่ค่าคงที่ใน Pipeline โดยไม่ต้องอ้างอิงจากฟิลด์เดิม ใช้ได้ทั้ง String, Number, Object, Array