sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB Aggregation:Beregn løbende totaler fra summen af ​​tidligere rækker

Dette gør, hvad du har brug for. Jeg har normaliseret tiderne i dataene, så de grupperer sig (Du kunne gøre sådan noget). Ideen er at $group og tryk på time 's og total 's i separate arrays. Derefter $unwind time array, og du har lavet en kopi af totals array for hver time dokument. Du kan derefter beregne runningTotal (eller noget som det rullende gennemsnit) fra arrayet, der indeholder alle data for forskellige tidspunkter. 'Indekset' genereret af $unwind er matrixindekset for total svarende til det time . Det er vigtigt at $sort før $unwind ing, da dette sikrer, at arrays er i den rigtige rækkefølge.

db.temp.aggregate(
    [
        {
            '$group': {
                '_id': '$time',
                'total': { '$sum': '$value' }
            }
        },
        {
            '$sort': {
                 '_id': 1
            }
        },
        {
            '$group': {
                '_id': 0,
                'time': { '$push': '$_id' },
                'totals': { '$push': '$total' }
            }
        },
        {
            '$unwind': {
                'path' : '$time',
                'includeArrayIndex' : 'index'
            }
        },
        {
            '$project': {
                '_id': 0,
                'time': { '$dateToString': { 'format': '%Y-%m-%d', 'date': '$time' }  },
                'total': { '$arrayElemAt': [ '$totals', '$index' ] },
                'runningTotal': { '$sum': { '$slice': [ '$totals', { '$add': [ '$index', 1 ] } ] } },
            }
        },
    ]
);

Jeg har brugt noget lignende på en samling med ~80.000 dokumenter, samlet til 63 resultater. Jeg er ikke sikker på, hvor godt det vil fungere på større samlinger, men jeg har fundet ud af, at udførelse af transformationer (projektioner, array-manipulationer) på aggregerede data ikke ser ud til at have store ydeevneomkostninger, når først dataene er reduceret til en håndterbar størrelse.



  1. Hvordan kan jeg køre MongoDB som en Windows-tjeneste?

  2. håndtere @ i mongodb forbindelsesstreng

  3. Automatisk stigningssekvens i mongodb ved hjælp af java

  4. Tjek, om MongoDB upsert foretog en indsættelse eller en opdatering