Agregasi ini memberikan hasil yang diinginkan.
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 } }
] )
[ EDIT TAMBAH ]
Output dari query menggunakan data input dari post pertanyaan:
{ "count" : 1, "iid" : "INT123", "pid" : "P789" }
{ "count" : 1, "iid" : "INT123", "pid" : "P123" }
{ "count" : 0, "iid" : "INT789", "pid" : "P789" }
{ "count" : 1, "iid" : "INT456", "pid" : "P789" }
Kueri ini mendapatkan hasil yang sama dengan pendekatan (kode) yang berbeda:
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
}
}
] )
[ EDIT TAMBAH 3 ]
CATATAN:
Kueri faset menjalankan dua faset (TRUE dan FALSE) pada kumpulan dokumen yang sama; itu seperti dua kueri yang berjalan secara paralel. Tapi, ada beberapa duplikasi kode serta tahapan tambahan untuk membentuk dokumen di jalur pipa untuk mendapatkan hasil yang diinginkan.
Kueri kedua menghindari duplikasi kode, dan ada tahapan yang jauh lebih rendah dalam alur agregasi. Ini akan membuat perbedaan ketika dataset input memiliki banyak dokumen untuk diproses - dalam hal kinerja. Secara umum, tahapan yang lebih rendah berarti iterasi dokumen yang lebih sedikit (sebagai tahapan harus memindai dokumen yang merupakan keluaran dari tahap sebelumnya).