cái tương ứng với câu lệnh SQL "case" trong khuôn khổ tổng hợp, là toán tử $ cond (xem hướng dẫn sử dụng). Các câu lệnh $ cond có thể được lồng vào nhau để mô phỏng "when-then" và "else", nhưng tôi đã chọn một cách tiếp cận khác, vì nó dễ đọc hơn (và để tạo, xem bên dưới):Tôi sẽ sử dụng toán tử $ concat để viết chuỗi phạm vi, sau đó đóng vai trò là khóa nhóm.
Vì vậy, đối với bộ sưu tập đã cho:
db.xx.find()
{ "_id" : ObjectId("514919fb23700b41723f94dc"), "name" : "A", "timespent" : 100 }
{ "_id" : ObjectId("514919fb23700b41723f94dd"), "name" : "B", "timespent" : 200 }
{ "_id" : ObjectId("514919fb23700b41723f94de"), "name" : "C", "timespent" : 300 }
{ "_id" : ObjectId("514919fb23700b41723f94df"), "name" : "D", "timespent" : 400 }
{ "_id" : ObjectId("514919fb23700b41723f94e0"), "name" : "E", "timespent" : 500 }
tổng hợp (mã cứng) trông như thế này:
db.xx.aggregate([
{ $project: {
"_id": 0,
"range": {
$concat: [{
$cond: [ { $lte: ["$timespent", 250] }, "range 0-250", "" ]
}, {
$cond: [ { $and: [
{ $gte: ["$timespent", 251] },
{ $lt: ["$timespent", 450] }
] }, "range 251-450", "" ]
}, {
$cond: [ { $and: [
{ $gte: ["$timespent", 451] },
{ $lt: ["$timespent", 650] }
] }, "range 450-650", "" ]
}]
}
}},
{ $group: { _id: "$range", count: { $sum: 1 } } },
{ $sort: { "_id": 1 } },
]);
và kết quả là:
{
"result" : [
{
"_id" : "range 0-250",
"count" : 2
},
{
"_id" : "range 251-450",
"count" : 2
},
{
"_id" : "range 450-650",
"count" : 1
}
],
"ok" : 1
}
Để tạo lệnh tổng hợp, bạn phải tạo phép chiếu "phạm vi" dưới dạng đối tượng JSON (hoặc bạn có thể tạo một chuỗi và sau đó sử dụng JSON.parse (string))
Trình tạo có dạng như sau:
var ranges = [ 0, 250, 450, 650 ];
var rangeProj = {
"$concat": []
};
for (i = 1; i < ranges.length; i++) {
rangeProj.$concat.push({
$cond: {
if: {
$and: [{
$gte: [ "$timespent", ranges[i-1] ]
}, {
$lt: [ "$timespent", ranges[i] ]
}]
},
then: "range " + ranges[i-1] + "-" + ranges[i],
else: ""
}
})
}
db.xx.aggregate([{
$project: { "_id": 0, "range": rangeProj }
}, {
$group: { _id: "$range", count: { $sum: 1 } }
}, {
$sort: { "_id": 1 }
}]);
sẽ trả về kết quả tương tự như trên.