Ja, det er lidt sværere i betragtning af, at der er flere arrays, og hvis du prøver begge på samme tid, ender du med en "kartesisk tilstand", hvor den ene array multiplicerer indholdet af den anden.
Derfor skal du bare kombinere array-indholdet i begyndelsen, hvilket sandsynligvis indikerer, hvordan du skal gemme dataene i første omgang:
Model.aggregate(
[
{ "$project": {
"company": 1,
"model": 1,
"data": {
"$setUnion": [
{ "$map": {
"input": "$pros",
"as": "pro",
"in": {
"type": { "$literal": "pro" },
"value": "$$pro"
}
}},
{ "$map": {
"input": "$cons",
"as": "con",
"in": {
"type": { "$literal": "con" },
"value": "$$con"
}
}}
]
}
}},
{ "$unwind": "$data" }
{ "$group": {
"_id": {
"company": "$company",
"model": "$model",
"tag": "$data.value"
},
"pros": {
"$sum": {
"$cond": [
{ "$eq": [ "$data.type", "pro" ] },
1,
0
]
}
},
"cons": {
"$sum": {
"$cond": [
{ "$eq": [ "$data.type", "con" ] },
1,
0
]
}
}
}
],
function(err,result) {
}
)
Så via det første $project
iscenesætte $map
operatører tilføjer "type" værdien til hvert element i hvert array. Ikke at det virkelig betyder noget her, da alle elementer skal behandles "unik" alligevel, $setUnion
operatoren "sammensætter" hvert array til et enkelt array.
Som nævnt tidligere, bør du sandsynligvis opbevare på denne måde i første omgang.
Behandl derefter $unwind
efterfulgt af $group
, hvor hver "pros" og "cons" derefter evalueres via $cond
for at det matcher "type", enten returnerer 1
eller 0
hvor matchet er henholdsvis true/false
til $sum
aggregeringsakkumulator.
Dette giver dig et "logisk match" for at tælle hver respektive "type" i aggregeringsoperationen i henhold til de specificerede grupperingsnøgler.