การตั้ง Alias (ชื่อสม مستعار) ให้ Field ใน MongoDB เหมือน SQL AS
ใน SQL ใช้ SELECT field AS alias ใน MongoDB ใช้ $project ใน Aggregation Pipeline เพื่อเปลี่ยนชื่อฟิลด์ในผลลัพธ์
ไวยากรณ์ MongoDB Equivalent
db.yourCollectionName.aggregate([
{ "$project": {
"_id": 0,
"anyAliasName": "$yourFieldName"
}}
]);
ตัวอย่างการสร้างคอลเลกชันและเพิ่มข้อมูล
> db.selectFieldAsAnotherNameDemo.insertOne({"Name":"Larry"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d448827b86948e204ca91") }
> db.selectFieldAsAnotherNameDemo.insertOne({"Name":"Robert"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d449027b86948e204ca92") }
> db.selectFieldAsAnotherNameDemo.insertOne({"Name":"Sam"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d449527b86948e204ca93") }
> db.selectFieldAsAnotherNameDemo.insertOne({"Name":"Mike"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d449927b86948e204ca94") }
แสดงข้อมูลทั้งหมด
> db.selectFieldAsAnotherNameDemo.find().pretty();
ผลลัพธ์:
{ "_id" : ObjectId("5c9d448827b86948e204ca91"), "Name" : "Larry" }
{ "_id" : ObjectId("5c9d449027b86948e204ca92"), "Name" : "Robert" }
{ "_id" : ObjectId("5c9d449527b86948e204ca93"), "Name" : "Sam" }
{ "_id" : ObjectId("5c9d449927b86948e204ca94"), "Name" : "Mike" }
ตั้ง Alias "StudentName" ให้ Field "Name"
> db.selectFieldAsAnotherNameDemo.aggregate([
{ "$project": {
"_id": 0,
"StudentName": "$Name"
}}
]);
ผลลัพธ์ (Field Name เปลี่ยนเป็น StudentName):
{ "StudentName" : "Larry" }
{ "StudentName" : "Robert" }
{ "StudentName" : "Sam" }
{ "StudentName" : "Mike" }
คำอธิบาย $project Syntax
- "_id": 0 : Exclude _id (Default เป็น 1 ต้องระบุ 0 ถ้าไม่ต้องการ)
- "NewName": "$OldName" : สร้าง Field ใหม่ชื่อ NewName ค่าเท่ากับ Field OldName
- $ Prefix : บอกว่าเป็น Field Reference ไม่ใช่ Literal String
ตัวอย่างขั้นสูง: Multiple Aliases และ Computed Fields
db.collection.aggregate([
{ $project: {
_id: 0,
// Simple Rename
"fullName": "$name",
// Computed Field
"nameLength": { $strLenCP: "$name" },
// Conditional
"status": {
$cond: { if: { $gt: ["$age", 18] }, then: "Adult", else: "Minor" }
},
// Keep Original
"originalName": "$name",
"age": 1
}}
]);
การใช้ $addFields (MongoDB 3.4+) - เพิ่ม Field โดยเก็บ Field เดิมไว้
db.collection.aggregate([
{ $addFields: {
"StudentName": "$Name" // เพิ่ม Field ใหม่ เก็บ Name ไว้ด้วย
}}
]);
ผลลัพธ์: มีทั้ง Name และ StudentName
การเปรียบเทียบ SQL vs MongoDB
| SQL | MongoDB Aggregation |
|---|---|
| SELECT name AS student_name FROM users | db.users.aggregate([{$project: {student_name: "$name", _id: 0}}]) |
| SELECT name, UPPER(name) AS upper_name FROM users | db.users.aggregate([{$project: {name: 1, upper_name: {$toUpper: "$name"}, _id: 0}}]) |
| SELECT name, CASE WHEN age>18 THEN 'Adult' ELSE 'Minor' END AS status FROM users | db.users.aggregate([{$project: {name: 1, status: {$cond: [{$gt: ["$age", 18]}, "Adult", "Minor"]}, _id: 0}}]) |
การใช้งานใน find() (Projection Only - ไม่เปลี่ยนชื่อได้)
// find() สามารถ Include/Exclude Field ได้ แต่ ไม่สามารถ Rename Field ได้
db.collection.find({}, { name: 1, _id: 0 }); // { "name": "Larry" }
// ต้องใช้ Aggregation ถ้าต้องการ Rename
db.collection.aggregate([{$project: { studentName: "$name", _id: 0 }}]); // { "studentName": "Larry" }
สรุป: ใช้ $project ใน Aggregation Pipeline เพื่อ Rename/Compute Fields เหมือน SQL AS