MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Agregasi MongoDB:Hitung Total Berjalan dari jumlah baris sebelumnya

Ini melakukan apa yang Anda butuhkan. Saya telah menormalkan waktu dalam data sehingga mereka dikelompokkan bersama (Anda dapat melakukan sesuatu seperti ini). Idenya adalah untuk $group dan tekan time 's dan totals 's ke dalam array yang terpisah. Kemudian $unwind time array, dan Anda telah membuat salinan totals larik untuk setiap time dokumen. Anda kemudian dapat menghitung runningTotal (atau sesuatu seperti rata-rata bergulir) dari larik yang berisi semua data untuk waktu yang berbeda. 'Indeks' yang dihasilkan oleh $unwind adalah indeks array untuk totals sesuai dengan time itu . Penting untuk $sort sebelum $unwind ing karena ini memastikan array berada dalam urutan yang benar.

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

Saya telah menggunakan sesuatu yang serupa pada koleksi dengan ~80 000 dokumen, menggabungkan ke 63 hasil. Saya tidak yakin seberapa baik itu akan bekerja pada koleksi yang lebih besar, tetapi saya telah menemukan bahwa melakukan transformasi (proyeksi, manipulasi array) pada data agregat tampaknya tidak memiliki biaya kinerja yang besar setelah data dikurangi menjadi ukuran yang dapat dikelola.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kinerja MongoDB:Menjalankan Operasi Pengurangan Peta MongoDB di Sekunder

  2. Pertanyaan Wawancara MongoDB Umum

  3. $proyek di $lookup mongodb

  4. Penggunaan data buffer tahap sortir overflow melebihi batas internal

  5. Beberapa kondisi bergabung menggunakan operator $lookup