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

การนับและหาผลรวมฟิลด์ระหว่าง 2 วันที่ใน MongoDB Aggregation

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 ได้)