Sử dụng $cond kết hợp $group để tính tổng giá trị Price cho các ID duy nhất. Tạo collection:
> 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") }
Hiển thị dữ liệu:
> 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 }
Pipeline phức tạp: Xác định ID đại diện (Id2 nếu có, ngược lại Id1), nhóm theo ID đó, tổng Price, và lấy ID duy nhất:
> 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 } }
... ]);
Kết quả: Tổng Price = 20 cho ID "110":
{ "Price" : 20, "Id1" : "110" }
Logic: Hai bản ghi cùng Name="John". Bản ghi 1: Id1=110, Id2=111. Bản ghi 2: Id1=111, Id2=rỗng. ID đại diện: bản ghi 1 dùng Id2=111, bản ghi 2 dùng Id1=111. Nhóm theo 111 → tổng Price=20. ID duy nhất không trùng: 110.