Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Tổng hợp giá trị duy nhất từ các phần tử collection MongoDB

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.