Proyecto selectivo agregado MongoDB

Tengo problemas para cambiar la forma de mi documento durante la agregación para la agrupación. Básicamente, quiero insertar entradas en los campos según su tipo. Tengo una estructura de la siguiente manera:

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

Quiero $ desenrollar y $ proyectar estas entidades para obtener una estructura como:

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

entonces puedo realizar una agrupación por A o B o ambos, es decir

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

Pensé que simplemente podría hacer:

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

o en su defecto algo así

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

pero ambas versiones fallan porque no puedo hacer nada más y no logré usar $ push dentro de un condicional. Lo más cercano que obtuve es un proyecto dependiendo del tipo, pero como no pude encontrar una manera de no agregar nada al campo cuando no había coincidencia, termino con:

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

que arruina el conteo. Mi segunda idea fue filtrar los arreglos para eliminar nulos. Pero no encontré una forma de eliminar entidades, porque de nuevo $ condnt no me dejaba especificar un caso vacío / "no hacer nada".

Tengo la sensación de que podría funcionar agrupando por tipo y contenido con la coincidencia de los tipos requeridos, pero debido a que tengo muchos tipos y agrupaciones arbitrarias que resultan en un árbol de agrupación, esto podría volverse muy complicado. Ideas o sugerencias de errores serían muy bienvenidas.

Gracias

EDITAR: La solución basada en la respuesta aceptada

Tuve que adaptarlo ligeramente, para filtrar casos en los que todo el contenido de un tipo era nulo, porque de lo contrario se habría perdido durante la coincidencia y porque quiero mantener ese conocimiento. ¡Gracias!

{$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" }
}}

Respuestas a la pregunta(1)

Su respuesta a la pregunta