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

ดึงรายการค่า (List of Values) ด้วย MongoDB $group และ $push

บทความนี้สาธิตการใช้ Aggregation Framework โดยเฉพาะ $group ร่วมกับ $push เพื่อจัดกลุ่มเอกสารและรวมค่าของฟิลด์เป็น Array (List of Values)

สร้างข้อมูลตัวอย่าง

> db.groupByDemo.insertOne({"UserName":"John","Subject":"MongoDB"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69f0457806ebf1256f136") }
> db.groupByDemo.insertOne({"UserName":"Larry","Subject":"MySQL"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69f0657806ebf1256f137") }
> db.groupByDemo.insertOne({"UserName":"John","Subject":"Java"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69f0d57806ebf1256f138") }
> db.groupByDemo.insertOne({"UserName":"John","Subject":"C"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69f1357806ebf1256f139") }
> db.groupByDemo.insertOne({"UserName":"Larry","Subject":"SQL Server"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69f1c57806ebf1256f13a") }

แสดงข้อมูลต้นฉบับ

> db.groupByDemo.find().pretty();
{ "_id" : ObjectId("5cd69f0457806ebf1256f136"), "UserName" : "John", "Subject" : "MongoDB" }
{ "_id" : ObjectId("5cd69f0657806ebf1256f137"), "UserName" : "Larry", "Subject" : "MySQL" }
{ "_id" : ObjectId("5cd69f0d57806ebf1256f138"), "UserName" : "John", "Subject" : "Java" }
{ "_id" : ObjectId("5cd69f1357806ebf1256f139"), "UserName" : "John", "Subject" : "C" }
{ "_id" : ObjectId("5cd69f1c57806ebf1256f13a"), "UserName" : "Larry", "Subject" : "SQL Server" }

Group โดย UserName และ Push Subject เป็น Array

> db.groupByDemo.aggregate({$group: { '_id': '$UserName', 'Subject': { $push: '$Subject' }}});

ผลลัพธ์

{ "_id" : "Larry", "Subject" : [ "MySQL", "SQL Server" ] }
{ "_id" : "John", "Subject" : [ "MongoDB", "Java", "C" ] }

คำอธิบาย

  • $group: จัดกลุ่มเอกสาร โดย _id: '$UserName' หมายถึง Group โดยค่า UserName
  • $push: สะสมค่า $Subject ของแต่ละ Document ใน Group เข้า Array
  • ลำดับใน Array ตามลำดับ Document ที่เข้ามา (ไม่保证 Sorted)

ตัวอย่างเพิ่มเติม: $addToSet (ไม่ให้ซ้ำ)

db.groupByDemo.aggregate([
  { $group: { 
    _id: '$UserName', 
    Subjects: { $addToSet: '$Subject' }  // Unique values only
  }}
]);

ตัวอย่าง: Push Object ทั้งตัว (ไม่แค่ Field เดียว)

db.orders.aggregate([
  { $group: {
    _id: '$customerId',
    orders: { $push: { orderId: '$_id', total: '$total', date: '$date' } }
  }}
]);

ตัวอย่าง: เรียงลำดับใน Array ด้วย $sort ก่อน $push (MongoDB 3.6+)

db.collection.aggregate([
  { $sort: { "Subject": 1 } },  // เรียงก่อน Push
  { $group: { _id: "$UserName", Subjects: { $push: "$Subject" } } }
]);