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

วิธีดึงค่าแรกของ Array ใน MongoDB ด้วย Aggregate

การดึงค่าแรกของ 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 แรก เนื่องจากทำให้ข้อมูลขยายใหญ่ขึ้นชั่วคราว ส่งผลต่อประสิทธิภาพ