MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB, Nombre multiple (avec $existe)

Vous aviez la bonne idée de base mais $exists est une condition de requête et n'est donc valide que dans un $match . Ce que vous voulez, c'est le $ifNull opérateur pour faire essentiellement la même chose :

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

Ainsi, le $ifNull soit renvoie la valeur actuelle du champ s'il existe, soit l'argument "côté droit" est renvoyé s'il n'existe pas. La valeur renvoyée autre que false est interprété comme étant true (sauf si bien sûr la valeur est réellement fausse).

Cela vous donne essentiellement la même fonctionnalité de test logique de l'existence d'une propriété dans le document.