การดึงค่าแรกของ Array ใน MongoDB
มีหลายวิธีในการดึงค่าแรกของ Array ใน MongoDB วิธีหลักคือใช้ Aggregation Pipeline กับ $unwind และ $first หรือใช้ $slice ใน find()
ตัวอย่างการสร้างคอลเลกชันและเพิ่มข้อมูล
> db.getFirstElementInArrayDemo.insertOne({"StudentName":"John","StudentSubject":["MongoDB","Python","MySQL"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9c41292d6669774125244e") }
> db.getFirstElementInArrayDemo.insertOne({"StudentName":"Chris","StudentSubject":["Java","C"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9c413f2d6669774125244f") }
> db.getFirstElementInArrayDemo.insertOne({"StudentName":"Robert","StudentSubject":["C++","Ruby"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9c41532d66697741252450") }
แสดงข้อมูลทั้งหมด
> db.getFirstElementInArrayDemo.find().pretty();
ผลลัพธ์:
{ "_id" : ObjectId("5c9c41292d6669774125244e"), "StudentName" : "John", "StudentSubject" : [ "MongoDB", "Python", "MySQL" ] }
{ "_id" : ObjectId("5c9c413f2d6669774125244f"), "StudentName" : "Chris", "StudentSubject" : [ "Java", "C" ] }
{ "_id" : ObjectId("5c9c41532d66697741252450"), "StudentName" : "Robert", "StudentSubject" : [ "C++", "Ruby" ] }
วิธีที่ 1: ใช้ Aggregation Pipeline ($unwind + $first)
> db.getFirstElementInArrayDemo.aggregate([
{$unwind: "$StudentSubject"},
{$group: {"_id": "$_id", "FirstElement": {$first: "$StudentSubject"}}},
{$project: {"_id": 0, "FirstElement": 1}}
]);
ผลลัพธ์:
{ "FirstElement" : "MongoDB" }
{ "FirstElement" : "Java" }
{ "FirstElement" : "C++" }
วิธีที่ 2: ใช้ $slice ใน find() (ง่ายกว่าและเร็วกว่า)
> db.getFirstElementInArrayDemo.find({}, {"StudentSubject": {$slice: 1}});
ผลลัพธ์:
{ "_id" : ObjectId("5c9c41292d6669774125244e"), "StudentName" : "John", "StudentSubject" : [ "MongoDB" ] }
{ "_id" : ObjectId("5c9c413f2d6669774125244f"), "StudentName" : "Chris", "StudentSubject" : [ "Java" ] }
{ "_id" : ObjectId("5c9c41532d66697741252450"), "StudentName" : "Robert", "StudentSubject" : [ "C++" ] }
การเปรียบเทียบวิธีต่างๆ
| วิธี | ความซับซ้อน | ประสิทธิภาพ | รูปแบบผลลัพธ์ |
|---|---|---|---|
| $slice ใน find() | ต่ำ | สูง | คืน array ที่มี 1 element |
| $unwind + $group + $first | สูง | ต่ำกว่า | คืนค่า scalar โดยตรง |
| $arrayElemAt (aggregation) | ปานกลาง | ดี | คืนค่า scalar โดยตรง |
วิธีที่ 3: ใช้ $arrayElemAt ใน Aggregation (แนะนำสำหรับ MongoDB 3.2+)
> db.getFirstElementInArrayDemo.aggregate([
{$project: {"FirstElement": {$arrayElemAt: ["$StudentSubject", 0]}, "_id": 0}}
]);
ผลลัพธ์:
{ "FirstElement" : "MongoDB" }
{ "FirstElement" : "Java" }
{ "FirstElement" : "C++" }
สรุปคำแนะนำ
- ใช้ $slice ใน find() สำหรับกรณีง่ายๆ ต้องการได้ array ที่มี element แรก
- ใช้ $arrayElemAt ใน aggregation เมื่อต้องการค่า scalar โดยตรงหรือต้องทำการประมวลผลเพิ่มเติม
- หลีกเลี่ยง $unwind สำหรับการดึงแค่ element แรก เนื่องจากทำให้ข้อมูลขยายใหญ่ขึ้นชั่วคราว ส่งผลต่อประสิทธิภาพ