Sự kết hợp này cho kết quả mong muốn.
db.posts.aggregate( [
{ $match: { updatedAt: { $gte: 1549786260000 } } },
{ $facet: {
FALSE: [
{ $match: { toggle: false } },
{ $unwind : "$interests" },
{ $group : { _id : { iid: "$interests", pid: "$publisher" }, count: { $sum : 1 } } },
],
TRUE: [
{ $match: { toggle: true, status: "INACTIVE" } },
{ $unwind : "$interests" },
{ $group : { _id : { iid: "$interests", pid: "$publisher" }, count: { $sum : -1 } } },
]
} },
{ $project: { result: { $concatArrays: [ "$FALSE", "$TRUE" ] } } },
{ $unwind: "$result" },
{ $replaceRoot: { newRoot: "$result" } },
{ $group : { _id : "$_id", count: { $sum : "$count" } } },
{ $project:{ _id: 0, iid: "$_id.iid", pid: "$_id.pid", count: 1 } }
] )
[CHỈNH SỬA THÊM]
Đầu ra từ truy vấn sử dụng dữ liệu đầu vào từ bài đăng câu hỏi:
{ "count" : 1, "iid" : "INT123", "pid" : "P789" }
{ "count" : 1, "iid" : "INT123", "pid" : "P123" }
{ "count" : 0, "iid" : "INT789", "pid" : "P789" }
{ "count" : 1, "iid" : "INT456", "pid" : "P789" }
Truy vấn này nhận được cùng một kết quả với cách tiếp cận (mã) khác nhau:
db.posts.aggregate( [
{
$match: { updatedAt: { $gte: 1549786260000 } }
},
{
$unwind : "$interests"
},
{
$group : {
_id : {
iid: "$interests",
pid: "$publisher"
},
count: {
$sum: {
$switch: {
branches: [
{ case: { $eq: [ "$toggle", false ] },
then: 1 },
{ case: { $and: [ { $eq: [ "$toggle", true] }, { $eq: [ "$status", "INACTIVE" ] } ] },
then: -1 }
]
}
}
}
}
},
{
$project:{
_id: 0,
iid: "$_id.iid",
pid: "$_id.pid",
count: 1
}
}
] )
[CHỈNH SỬA THÊM 3]
LƯU Ý:
Truy vấn khía cạnh chạy hai khía cạnh (TRUE và FALSE) trên cùng một bộ tài liệu; nó giống như hai truy vấn chạy song song. Tuy nhiên, có một số mã trùng lặp cũng như các giai đoạn bổ sung để định hình các tài liệu theo đường dẫn để có được đầu ra mong muốn.
Truy vấn thứ hai tránh trùng lặp mã và có ít giai đoạn hơn trong quy trình tổng hợp. Điều này sẽ tạo ra sự khác biệt khi tập dữ liệu đầu vào có một số lượng lớn tài liệu cần xử lý - về mặt hiệu suất. Nói chung, các giai đoạn nhỏ hơn có nghĩa là ít lần lặp lại tài liệu hơn (vì một giai đoạn phải quét các tài liệu được xuất ra từ giai đoạn trước).