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