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

MongoDB Equivalent ของ SELECT field AS alias (ตั้งชื่อเหมือน SQL)

การตั้ง 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

SQLMongoDB Aggregation
SELECT name AS student_name FROM usersdb.users.aggregate([{$project: {student_name: "$name", _id: 0}}])
SELECT name, UPPER(name) AS upper_name FROM usersdb.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 usersdb.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