MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB, Mehrfachzählung (mit $exists)

Sie hatten die richtige Grundidee, aber $exists ist eine Abfragebedingung und ist daher nur innerhalb eines $match . Was Sie wollen, ist der $ifNull Operator im Wesentlichen dasselbe tun:

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

Also der $ifNull Gibt entweder den aktuellen Wert des Felds zurück, falls vorhanden, oder das Argument "rechte Seite" wird zurückgegeben, wenn dies nicht der Fall ist. Der zurückgegebene Wert außer false wird als true interpretiert (es sei denn, der Wert ist tatsächlich falsch).

Im Wesentlichen gibt Ihnen dies die gleiche Funktionalität des logischen Testens auf das Vorhandensein einer Eigenschaft im Dokument.