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

MongoDB, conteo múltiple (con $existe)

Tenías la idea básica correcta pero $exists es una condición de consulta, por lo que solo es válida dentro de un $match . Lo que quieres es $ifNull operador para hacer esencialmente lo mismo:

db.mycollection.aggregate( [
    { "$group": {
        "_id" : { "user_id": "$user_id" },
        "requestA_count": { "$sum": {
            "$cond": [ { "$ifNull": ["$requestA", false] }, 1, 0 ]
        } },
        "requestB_count": { "$sum": {
            "$cond": [ { "$ifNull": ["$requestB", false] }, 1, 0 ]
        } },
        "requestC_count": { "$sum": {
            "$cond": [ { "$ifNull": ["$requestC", false] }, 1, 0 ]
        } },
    } },
    { "$project": {
        "_id": 0,
        "user_id": "$_id.user_id",
        "requestA_count": 1,
        "requestB_count": 1,
        "requestC_count": 1
    } }
] );

Entonces, el $ifNull devuelve el valor actual del campo si existe o se devuelve el argumento del "lado derecho" si no existe. El valor devuelto que no sea false se interpreta como true (a menos, por supuesto, que el valor sea realmente falso).

Esencialmente, esto le brinda la misma funcionalidad de probar lógicamente la existencia de una propiedad en el documento.