sql >> Database >  >> NoSQL >> MongoDB

MongoDB, Meerdere tellingen (met $ bestaat)

Je had het juiste basisidee, maar $exists is een vraagvoorwaarde en is dus alleen geldig binnen een $match . Wat je wilt is de $ifNull operator om in wezen hetzelfde te doen:

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

Dus de $ifNull ofwel retourneert de huidige waarde van het veld als het bestaat of het argument "rechterkant" wordt geretourneerd als dat niet het geval is. De geretourneerde waarde anders dan false wordt geïnterpreteerd als true ( tenzij de waarde natuurlijk onwaar is ).

Dit geeft u in wezen dezelfde functionaliteit als logisch testen op het bestaan ​​van een eigenschap in het document.




  1. mangoest een object uit een geneste array verwijderen

  2. Mongo:verzamel $geoNear en $text geen resultaten

  3. Hoe initiële gegevens in MongoDB te laden?

  4. Hoe een enkel object bij te werken met de RESTHeart-patch?