Count และ Sum ระหว่างช่วงวันที่ด้วย Aggregation Pipeline
บทความนี้สาธิตการใช้ $match พร้อม $gte และ $lte เพื่อกรองช่วงวันที่ แล้ว $group ร่วม $sum เพื่อนับจำนวนและหาผลรวมค่าฟิลด์
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
> db.countandsumdemo.insertOne({"Value":10,"created_at":ISODate('2019-10-11')});
{ "acknowledged": true, "insertedId": ObjectId("5e038e6df5e889d7a51994fa") }
> db.countandsumdemo.insertOne({"Value":50,"created_at":ISODate('2019-01-31')});
{ "acknowledged": true, "insertedId": ObjectId("5e038e77f5e889d7a51994fb") }
> db.countandsumdemo.insertOne({"Value":100,"created_at":ISODate('2019-06-31')});
{ "acknowledged": true, "insertedId": ObjectId("5e038e8af5e889d7a51994fc") }
หมายเหตุ: วันที่ 2019-06-31 ไม่มีจริง MongoDB จะปรับเป็น 2019-07-01
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.countandsumdemo.find().pretty();
ขั้นตอนที่ 3: Aggregation Pipeline นับและรวมค่าระหว่าง 2019-05-01 ถึง 2019-12-31
> db.countandsumdemo.aggregate([
{ $match: {
created_at: {
$gte: new Date('2019-05-01'),
$lte: new Date('2019-12-31')
}
}},
{ $group: {
_id: null,
SUM: { $sum: "$Value" },
COUNT: { $sum: 1 }
}}
]);
ผลลัพธ์ที่ได้
{ "_id": null, "SUM": 110, "COUNT": 2 }
เฉพาะรายการ 10 Oct (10) และ 1 Jul (100) อยู่ในช่วง -> SUM=110, COUNT=2
สรุป: รูปแบบนี้เป็นมาตรฐานสำหรับรายงานสรุปยอด (Summary Report) ตามช่วงเวลา ใช้ $match กรองช่วงก่อน จะมีประสิทธิภาพดีที่สุด (ใช้ Index ได้)