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

การรวมคุณสมบัติที่ไม่ซ้ำกันในเอลิเมนต์คอลเล็กชันต่างๆ และหาผลรวมราคา (Price) ใน MongoDB


เพื่อคำนวณผลรวมของคุณสมบัติที่ไม่ซ้ำกันในเอลิเมนต์คอลเล็กชันต่างๆ ให้ใช้ $cond ร่วมกับ $group ซึ่งจะให้ราคาผลรวม (Resultant Price)

มาสร้างคอลเล็กชันกันเถอะ

> db.demo580.insertOne(
    {
        "Name":"John",
        "Id1":"110",
        "Id2":"111",
        "Price":10.5
    }
);
{ "acknowledged" : true, "insertedId" : ObjectId("5e918cebfd2d90c177b5bcae") }
> db.demo580.insertOne(
    {
        "Name":"John",
        "Id1":"111",
        "Id2":"",
        "Price":9.5
    }
);
{ "acknowledged" : true, "insertedId" : ObjectId("5e918cecfd2d90c177b5bcaf") }

แสดงเอกสารทั้งหมดด้วยเมธอด find()

> db.demo580.find();

ผลลัพธ์ที่ได้

{ "_id" : ObjectId("5e918cebfd2d90c177b5bcae"), "Name" : "John", "Id1" : "110", "Id2" : "111", "Price" : 10.5 }
{ "_id" : ObjectId("5e918cecfd2d90c177b5bcaf"), "Name" : "John", "Id1" : "111", "Id2" : "", "Price" : 9.5 }

คำสั่งรวมคุณสมบัติที่ไม่ซ้ำกันในเอลิเมนต์คอลเล็กชันต่างๆ

> db.demo580.aggregate([
    {
        $project: {
            Id1: 1,
            Id2: 1,
            Price: 1,
            match: {
                $cond: [
                    {$eq: ["$Id2", ""]},
                    "$Id1",
                    "$Id2"
                ]
            }
        }
    },
    {
        $group: {
            _id: '$match',
            Price: {$sum: '$Price'},
            resultId: {
                $addToSet: {
                    $cond: [
                        {$eq: ['$match', '$Id1']},
                        null,
                        '$Id1'
                    ]
                }
            }
        }
    },
    {$unwind: '$resultId'},
    {$match: {
        resultId: {
            $ne: null
        }
    }},
    {
        $project: {
            Id1: '$resultId',
            Price: 1,
            _id: 0
        }
    }
])

ผลลัพธ์ที่ได้

{ "Price" : 20, "Id1" : "110" }