การสร้างคอลเลกชันพร้อมเอกสารตัวอย่าง
ขั้นแรก เราจะสร้างคอลเลกชันชื่อ demo121 พร้อมเอกสารที่มีโครงสร้างแบบฝัง (nested) ดังนี้:
> db.demo121.insertOne(
{
"Id": 101,
"Details": [
{ "SubjectId": "1", "SubjectName": "MongoDB", "Score": 76 },
{ "SubjectId": "2", "SubjectName": "MySQL", "Score": 76 },
{ "SubjectId": "3", "SubjectName": "Java", "Score": 76 }
]
}
);
{ "acknowledged": true, "insertedId": ObjectId("5e2f1c60140daf4c2a3544b3") }
แสดงเอกสารทั้งหมดด้วย find()
> db.demo121.find();
ผลลัพธ์ที่ได้:
{ "_id": ObjectId("5e2f1c60140daf4c2a3544b3"), "Id": 101, "Details": [ { "SubjectId": "1", "SubjectName": "MongoDB", "Score": 76 }, { "SubjectId": "2", "SubjectName": "MySQL", "Score": 76 }, { "SubjectId": "3", "SubjectName": "Java", "Score": 76 } ] }
คิวรี Aggregate สำหรับจัดกลุ่มและนับจำนวน
คิวรีต่อไปนี้ใช้ pipeline ประกอบด้วย $match, $unwind, และ $group สองครั้ง เพื่อจัดกลุ่มตาม SubjectId และรวบรวม SubjectName:
> db.demo121.aggregate([
{ "$match": { "Id": 101 } },
{ "$unwind": "$Details" },
{
"$group": {
"_id": "$Details.SubjectId",
"count": { "$sum": 1 },
"Details": {
"$push": { "SubjectName": "$Details.SubjectName" }
}
}
},
{
"$group": {
"_id": null,
"List": {
"$push": { "SubId": "$_id", "Details": "$Details" }
}
}
}
], function(err, out) {
res.json(out);
});
ผลลัพธ์จากการรัน Aggregate
{ "_id": null, "List": [ { "SubId": "3", "Details": [ { "SubjectName": "Java" } ] }, { "SubId": "2", "Details": [ { "SubjectName": "MySQL" } ] }, { "SubId": "1", "Details": [ { "SubjectName": "MongoDB" } ] } ] }