MongoDB aggregiertes selektives Projekt

Ich habe Probleme beim Umformen meines Dokuments während der Aggregation zum Gruppieren. Grundsätzlich möchte ich Einträge je nach Typ in Felder verschieben. Ich habe eine Struktur wie folgt:

_id: P1
   entities: [{type: A, val: X}, {type: B, val: X}, {type: A, val: Y}]
   ...

Ich möchte diese Entitäten $ abwickeln und $ projizieren, damit sie eine Struktur wie folgt erhalten:

_id: P1
   A: [X]
   B: []
_id: P1
   A: [Y]
   B: []
_id: P1
   A: []
   B: [X]

so kann ich eine Gruppierung nach A oder B oder beiden durchführen, d.h.

$group: {
   _id: {
       A: $A, 
       B: $B
    }
    count: {$sum : 1}

Ich dachte, ich könnte einfach machen:

$unwind: $entities
$project: {
   id: §id
   A: {"$cond":[{"$eq":["$type","A"]},"$code"]}
   B: {"$cond":[{"$eq":["$type","B"]},"$code"]}
}
$group: {
  _id: "$id"
  A: {$addToSet : "$A"}
}

oder scheitern, dass so etwas wie

$unwind: $entities
$group: {
  _id: "$id"
  A: {"$cond":[{"$eq":["$type","A"]},$push: "$code", null]}
  ...
}

Beide Versionen schlagen jedoch fehl, weil ich nichts weiter tun kann und es nicht geschafft habe, $ push in einer Bedingung zu verwenden. Das Projekt, das mir am nächsten kommt, hängt vom Typ ab. Da ich jedoch keine Möglichkeit gefunden habe, dem Feld nichts hinzuzufügen, als es keine Übereinstimmung gab, erhalte ich am Ende Folgendes:

_id: P1
   A: [X,null,Y]
   B: [null,X,null]

was die Zählung durcheinander bringt. Meine zweite Idee war, die Arrays zu filtern, um null zu entfernen. Aber ich habe keine Möglichkeit gefunden, Entities zu entfernen, da ich mit $ cond wieder keinen leeren / "do nothing" -anderen Fall angeben konnte.

Ich habe das Gefühl, es könnte mit der Gruppierung nach Typ und Inhalt mit dem Abgleichen der erforderlichen Typen funktionieren, aber da ich viele Typen und willkürliche Gruppierungen habe, die zu einem Gruppierungsbaum führen, kann dies sehr kompliziert werden. Ideen oder Hinweise auf Fehler wären sehr willkommen.

Danke

BEARBEITEN: Die Lösung basiert auf der akzeptierten Antwort

Ich musste es leicht anpassen, um Fälle zu filtern, in denen der gesamte Inhalt eines Typs null war, da er sonst während des Abgleichs verloren gegangen wäre und ich dieses Wissen behalten möchte. Vielen Dank!

{$project:{
  A: {$cond: [
      {$eq: ["$A", [false]]},
      ["N/A"],
      "$A"
  ]},
  B: {$cond: [
      {$eq: ["$B", [false]]},
      ["N/A"],
      "$B"
  ]},
}},
{ "$unwind": "$A" },
{ "$match": { "A": { "$ne": false } } },
{ "$group": {
    "_id": "$_id",
    "A": { "$push": "$A" },
    "B": { "$first": "$B" }
}},
{ "$unwind": "$B" },
{ "$match": { "B": { "$ne": false } } },
{ "$group": {
    "_id": "$_id",
    "A": { "$first": "$A" },
    "B": { "$push": "$B" }
}}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage