MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB, contagem múltipla (com $exists)


Você teve a ideia básica certa, mas $exists é uma condição de consulta, portanto, só é válida dentro de um $match . O que você quer é o $ifNull operador para essencialmente fazer a mesma coisa:
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
    } }
] );

Portanto, o $ifNull retorna o valor presente do campo se ele existir ou o argumento "lado direito" é retornado se não existir. O valor retornado diferente de false é interpretado como sendo true (a menos que o valor seja realmente falso).

Essencialmente, isso oferece a mesma funcionalidade de testar logicamente a existência de uma propriedade no documento.