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

hitung frekuensi menggunakan kerangka agregat mongodb

Jika ini hanya tentang mendapatkan sesuatu dalam interval 10 detik, Anda dapat melakukan sedikit matematika dan menjalankan ini melalui agregat:

db.collection.aggregate([
    { "$group": {
        "_id": {
             "year": { "$year": "$created_at" },
             "month":{ "$month": "$created_at" },
             "day": { "$dayOfMonth": "$created_at" },
             "hour": { "$hour": "$created_at" },
             "minute": { "$minute": "$created_at" },
             "second": { "$subtract": [
                 { "$second": "$created_at" },
                 { "$mod": [
                     { "$second": "$created_at" },
                     10
                 ]}
             ]}
        },
        "count": { "$sum" : 1 }
    }}
])

Jadi itu memecah segalanya menjadi interval 10 detik dalam satu menit di mana mereka terjadi dengan sedikit mod 10 matematika.

Saya pikir itu masuk akal, dan akan menjadi pelari tercepat karena menggunakan agregat. Jika Anda benar-benar membutuhkan urutan Anda seperti yang ditunjukkan sebagai 10 detik berjalan dari waktu yang awalnya cocok, maka Anda dapat melakukan prosesnya dengan mapReduce:

Pertama seorang pembuat peta:

var mapper = function () {

    if ( this.created_at.getTime() > ( last_date + 10000 ) ) {
        if ( last_date == 0 ) {
            last_date = this.created_at.getTime();
        } else {
            last_date += 10000;
        }
    }

    emit(
        {
            start: new Date( last_date ),
            end: new Date( last_date + 10000 )
        },
        this.created_at
    );

}

Jadi ini akan memancarkan tanggal dalam interval 10 detik, dimulai dengan kencan pertama dan kemudian meningkatkan interval setiap kali ditemukan sesuatu di luar jangkauan

Sekarang Anda membutuhkan peredam:

var reducer = function (key, values) {
    return values.length;
};

Sangat sederhana. Kembalikan saja panjang array yang dimasukkan.

Karena mapReduce bekerja seperti itu, apa pun yang tidak memiliki lebih dari satu nilai tidak akan diteruskan ke peredam, jadi bersihkan ini dengan finalize:

var finalize = function (key, value) {
    if ( typeof(value) == "object" ) {
        value = 1;
    }
    return value;
};

Kemudian jalankan saja untuk mendapatkan hasilnya. Perhatikan bagian "lingkup" yang meneruskan variabel global untuk digunakan di mapper:

db.collection.mapReduce(
    mapper,
    reducer,
    { 
        "out": { "inline": 1 }, 
        "scope": { "last_date": 0 }, 
        "finalize": finalize 
    }
)

Setiap pendekatan cenderung memberikan hasil yang sedikit berbeda, tetapi itulah intinya. Tergantung mana yang benar-benar ingin Anda gunakan.

Mempertimbangkan komentar Anda, Anda dapat "memeriksa" output dari salah satu pernyataan dan "mengisi celah" secara terprogram. Saya biasanya lebih suka opsi itu, tetapi Ini bukan program saya dan saya tidak tahu seberapa besar rangkaian yang Anda coba ambil dari kueri ini.

Di sisi server, Anda dapat menambal "mapper" untuk melakukan sesuatu seperti ini:

var mapper = function () {

    if ( this.created_at.getTime() > ( last_date + 10000 ) ) {

        if ( last_date == 0 ) {
            last_date = this.created_at.getTime();
        } else {
            // Patching for empty blocks
            var times = Math.floor( 
                 ( this.created_at.getTime() - last_date ) / 10000
            );

            if ( times > 1 ) {
                for ( var i=1; i < times; i++ ) {
                    last_date += 10000;
                    emit(
                        {
                            start: new Date( last_date ),
                            end: new Date( last_date + 10000 )
                        },
                        0
                    );
                }
            }
            // End patch
            last_date += 10000;
        }
    }

    emit(
        {
            start: new Date( last_date ),
            end: new Date( last_date + 10000 )
        },
        this.created_at
    );

}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menggunakan S3 sebagai database vs. database (mis. MongoDB)

  2. mongorestore dari standalone ke replicaset

  3. Driver Ruby Mongo:Bagaimana Cara Mencari Interval Tanggal?

  4. React.js:String HTML mentah tidak dikenali sebagai elemen HTML dari Node.js

  5. MongoDB $weeklyUpdate #65 (15 April 2022):Waktu GDELT, Mongoose, &Hackathon!