MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB, conteggio multiplo (con $esiste)

Avevi l'idea di base giusta, ma $exists è una condizione della query, quindi è valida solo all'interno di un $match . Quello che vuoi è il $ifNull operatore per fare essenzialmente la stessa cosa:

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

Quindi $ifNull restituisce il valore attuale del campo se esiste o viene restituito l'argomento "lato destro" in caso contrario. Il valore restituito diverso da false è interpretato come true (a meno che ovviamente il valore non sia effettivamente false).

Essenzialmente questo ti dà la stessa funzionalità di verifica logica per l'esistenza di una proprietà nel documento.