ในการคำนวณผลรวมของคุณสมบัติเฉพาะในองค์ประกอบคอลเลกชันต่างๆ ให้ใช้ $cond ร่วมกับ $group ซึ่งจะทำให้ได้ราคาผลลัพธ์
ให้เราสร้างคอลเลกชันที่มีเอกสาร -
> 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" }