sql >> Base de Datos >  >> NoSQL >> MongoDB

La matriz vacía evita que el documento aparezca en la consulta

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
        }
    }
])