sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB Agregace se součtem hodnot pole

Chcete-li dosáhnout vašich potřeb pomocí agregačního rámce, první fází procesu bude $match operace s dotyčným cestujícím, která shoduje dokumenty s uživatelem v poli cestujících, následuje $unwind operace, která dekonstruuje pole cestujících ze vstupních dokumentů v předchozí operaci, aby se vytiskl dokument pro každý prvek. Další $match následuje operace na dekonstruovaném poli, která dále filtruje předchozí tok dokumentů, aby umožnila pouze odpovídajícím dokumentům přejít bez úprav do další fáze kanálu, což je promítání požadovaných polí pomocí $project operátor. Tedy v podstatě váš agregační kanál pro user3 bude vypadat takto:

db.collection.aggregate([
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$unwind": "$passengers"
     },
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$project": {
             "_id": 0,
            "driver": "$driver",
            "times": "$passengers.times"
        }
     }
])

Výsledek :

/* 0 */
{
    "result" : [ 
        {
            "driver" : "user1",
            "times" : 3
        }, 
        {
            "driver" : "user2",
            "times" : 2
        }
    ],
    "ok" : 1
}

AKTUALIZACE :

Pro seskupení duplikátů u ovladačů s různými daty, jak jste zmínili, můžete vytvořit $group operaci těsně před posledním $project fáze potrubí, kde pomocí $sum vypočítáte celkové časy cestujících operátor:

db.collection.aggregate([
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$unwind": "$passengers"
     },
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$group": {
             "_id": "$driver", 
             "total": {
                 "$sum": "$passengers.times"
             }
         }
     },
     {
         "$project": {
            "_id": 0,
            "driver": "$_id",
            "total": 1
        }
     }
])

Výsledek :

/* 0 */
{
    "result" : [ 
        {
            "total" : 2,
            "driver" : "user2"
        }, 
        {
            "total" : 3,
            "driver" : "user1"
        }
    ],
    "ok" : 1
}



  1. Oblasti HBase se sloučí

  2. Pochopení odolnosti a bezpečnosti zápisu v MongoDB

  3. Redis se neaktualizuje při mnoha žádostech najednou

  4. docker-compose:spojení redis mezi kontejnery bylo odmítnuto