Denne sammenlægning giver det ønskede resultat.
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 TILFØJ ]
Outputtet fra forespørgslen ved hjælp af inputdata fra spørgsmålsindlægget:
{ "count" : 1, "iid" : "INT123", "pid" : "P789" }
{ "count" : 1, "iid" : "INT123", "pid" : "P123" }
{ "count" : 0, "iid" : "INT789", "pid" : "P789" }
{ "count" : 1, "iid" : "INT456", "pid" : "P789" }
Denne forespørgsel får det samme resultat med en anden tilgang (kode):
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 TILFØJ 3 ]
BEMÆRK:
Facetforespørgslen kører de to facetter (SAND og FALSK) på det samme sæt dokumenter; det er som to forespørgsler, der kører parallelt. Men der er en vis duplikering af kode såvel som yderligere trin til at forme dokumenterne ned ad pipelinen for at få det ønskede output.
Den anden forespørgsel undgår kodeduplikering, og der er meget mindre stadier i aggregeringspipelinen. Dette vil gøre en forskel, når inputdatasættet har et stort antal dokumenter, der skal behandles - med hensyn til ydeevne. Generelt betyder mindre trin mindre gentagelser af dokumenterne (da et trin skal scanne de dokumenter, der er output fra det foregående trin).