Puede usar el $cond
operador en un $project
escenario para reemplazar el attr
vacío matriz con una que contiene un marcador de posición como null
que se puede usar como marcador para indicar que este documento no contiene ningún attr
elementos.
Así que insertaría un $project
adicional escenario como este justo antes del $unwind
:
{
$project: {
attrs: {$cond: {
if: {$eq: ['$attrs', [] ]},
then: [null],
else: '$attrs'
}}
}
},
La única advertencia es que terminará con un null
valor en los attrs
finales matriz para aquellos grupos que contienen al menos un documento sin ningún attrs
elementos, por lo que debe ignorarlos del lado del cliente.
Ejemplo
El ejemplo usa un $match
alterado escenario porque el de tu ejemplo no es válido.
Documentos de entrada
[
{_id: {type: 1, id: 2}, attrs: []},
{_id: {type: 2, id: 1}, attrs: []},
{_id: {type: 2, id: 2}, attrs: [{name: 'john', type: 22}, {name: 'bob', type: 44}]}
]
Salida
{
"result" : [
{
"_id" : 1,
"attrs" : [
null
]
},
{
"_id" : 2,
"attrs" : [
{
"name" : "bob",
"type" : 44
},
{
"name" : "john",
"type" : 22
},
null
]
}
],
"ok" : 1
}
Comando agregado
db.test.aggregate([
{
$match: {
'_id.servicePath': {
$in: [
null
]
}
}
},
{
$project: {
_id: 1,
"attrs.name": 1,
"attrs.type": 1
}
},
{
$project: {
attrs: {$cond: {
if: {$eq: ['$attrs', [] ]},
then: [null],
else: '$attrs'
}}
}
},
{
$unwind: "$attrs"
},
{
$group: {
_id: "$_id.type",
attrs: {
$addToSet: "$attrs"
}
}
},
{
$sort: {
_id: 1
}
}
])