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

Peningkatan Kerangka Agregasi MongoDB 2.6

Ini posting tamu oleh Vlad Mihalcea. Vlad adalah arsitek perangkat lunak yang bersemangat tentang integrasi perangkat lunak, skalabilitas tinggi, dan tantangan konkurensi. Berikut ini tautan ke pos asli.

MongoDB berkembang pesat. Versi 2.2 memperkenalkan kerangka kerja agregasi sebagai alternatif untuk model kueri Pengurangan Peta. Menghasilkan laporan agregat adalah persyaratan berulang untuk sistem perusahaan dan MongoDB bersinar dalam hal ini. Jika Anda baru mengenalnya, Anda mungkin ingin memeriksa pengantar kerangka kerja agregasi ini atau penyesuaian performa dan panduan pemodelan data.

Mari kita gunakan kembali model data yang pertama kali saya perkenalkan sambil mendemonstrasikan kemampuan penyisipan MongoDB yang sangat cepat:

{ "_id" :ObjectId("5298a5a03b3f4220588fe57c"), "created_on" :ISODate("2012-04-22T01:09:53Z"), "nilai" :0.164785116706831}

Peningkatan Agregasi MongoDB 2.6

Dalam versi 2.4, jika saya menjalankan kueri agregasi berikut:

db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :new Date(Date.UTC(2012, 0, 1)), $lte :new Date(Date.UTC(2012, 0, 10)) } }},{ $group:{ _id :{ "menit" :{ $menit :"$created_on" } }, "nilai":{ $addToSet:"$value" } }}]); 

Saya mencapai batasan hasil agregasi 16MB:

{ "errmsg" :"exception:hasil agregasi melebihi ukuran dokumen maksimum (16MB)", "code" :16389, "ok" :0}

Dokumen MongoDB dibatasi hingga 16 MB, dan sebelum versi 2.6, hasil agregasinya adalah dokumen BSON. Versi 2.6 menggantinya dengan kursor.

Menjalankan kueri yang sama pada 2.6 menghasilkan hasil berikut:

db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :new Date(Date.UTC(2012, 0, 1)), $lte :new Date(Date.UTC(2012, 0, 10)) } }},{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }}]). objsLeftInBatch();14

Saya menggunakan metode objsLeftInBatch berbasis kursor untuk menguji jenis hasil agregasi dan batasan 16 MB tidak lagi berlaku untuk hasil keseluruhan. Hasil bagian dalam kursor adalah dokumen BSON biasa, oleh karena itu masih dibatasi hingga 16 MB, tetapi ini jauh lebih mudah dikelola daripada batas hasil keseluruhan sebelumnya.

Versi 2.6 juga membahas pembatasan memori agregasi. Pemindaian koleksi lengkap seperti:

db.randomData.aggregate( [{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }}]) .objsLeftInBatch();

dapat berakhir dengan kesalahan berikut:

{ "errmsg" :"exception:Melebihi batas memori untuk $group, tetapi tidak mengizinkan pengurutan eksternal. Lewati allowDiskUse:true untuk ikut serta.", "code" :16945, "ok" :0} 

Jadi, sekarang kita dapat melakukan operasi pengurutan besar menggunakan parameter allowDiskUse:

db.randomData.aggregate( [{ $group:{ _id :{ "menit" :{ $menit :"$created_on" } }, "nilai":{ $addToSet:"$value" } }}], { allowDiskUse :true}).objsLeftInBatch();

Versi 2.6 memungkinkan kita untuk menyimpan hasil agregasi ke koleksi yang berbeda menggunakan tahap $out yang baru ditambahkan.

db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :new Date(Date.UTC(2012, 0, 1)), $lte :new Date(Date.UTC(2012, 0, 10)) } }},{ $group:{ _id :{ "menit" :{ $menit :"$created_on" } }, "nilai":{ $addToSet:"$value" } }},{ $ out :"randomAggregates"}]);db.randomAggregates.count();60

Operator baru telah ditambahkan seperti let, map, cond, dan lain-lain.

Contoh berikutnya akan menambahkan AM atau PM ke info waktu dari setiap entri acara tertentu.

var dataSet =db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :new Date(Date.UTC(2012, 0, 1)), $lte :new Date(Date.UTC (2012, 0, 2)) } }},{ $proyek:{ "jam" :{ $biarkan:{ vars:{ "jam":{ $substr:["$created_on", 11, -1] }, "am_pm":{ $cond:{ if:{ $lt:[ {$hour :"$created_on" }, 12 ] } , maka:'AM',else:'PM'} } }, di:{ $concat :[ "$$jam", " ", "$$am_pm"] } } } }},{ $limit :10}]);dataSet.forEach(function(document) { printjson(document);}); 

Menghasilkan:

"clock" :"16:07:14 PM""clock" :"22:14:42 PM""clock" :"21:46:12 PM""clock" :"03:35:00 AM ""jam" :"04:14:20""jam" :"03:41:39""jam" :"17:08:35""jam" :"18:44:02"" clock" :"19:36:07 PM""clock" :"07:37:55 AM"

Kesimpulan

Versi MongoDB 2.6 hadir dengan banyak penyempurnaan seperti operasi massal atau persimpangan indeks. MongoDB terus berkembang, menawarkan alternatif yang layak untuk penyimpanan berbasis dokumen. Dengan tingkat perkembangan seperti itu, tidak heran jika database ini dinobatkan sebagai database terbaik tahun 2013.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana saya bisa meng-host Server Parse saya sendiri di Heroku menggunakan MongoDB?

  2. Temukan total waktu yang dihabiskan oleh pengguna di mongoDB

  3. Layanan Mongodb, sharding, dan banyak jendela

  4. TypeError:db.collection bukan fungsi

  5. Mengenkripsi Data MongoDB saat Istirahat