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

Desain Skema MongoDB - Voting pada Posting

Cara umum untuk melacak penghitungan suara secara keseluruhan adalah dengan menyimpan jumlah suara di dokumen pos dan memperbaruinya secara atomis saat memasukkan nilai baru ke susunan suara.

Karena ini adalah pembaruan tunggal, Anda dijamin bahwa hitungannya akan cocok dengan jumlah elemen dalam larik.

Jika jumlah agregasi tetap dan situs sangat sibuk, Anda dapat memperluas paradigma ini dan menambah penghitung tambahan, seperti satu untuk bulan, hari, dan jam, tetapi itu bisa lepas kendali dengan sangat cepat. Jadi, Anda dapat menggunakan Kerangka Agregasi yang baru (tersedia di rilis dev 2.1.2, akan diproduksi di rilis 2.2. Lebih mudah digunakan daripada Map/Reduce dan itu akan memungkinkan Anda untuk melakukan perhitungan yang Anda inginkan dengan sangat sederhana terutama jika Anda berhati-hati untuk menyimpan tanggal pemungutan suara Anda sebagai Jenis ISODate().

Saluran umum untuk kueri agregasi untuk peraih suara terbanyak bulan ini mungkin terlihat seperti ini:

today = new Date();
thisMonth = new Date(today.getFullYear(),today.getMonth());
thisMonthEnd = new Date(today.getFullYear(),today.getMonth()+1);

db.posts.aggregate( [
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$unwind: "$Votes" },
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$group: { _id: "$title", votes: {$sum:1} } },
    {$sort: {"votes": -1} },
    {$limit: 10}
] );

Ini membatasi input ke saluran ke posting yang memiliki suara dengan mencocokkan tanggal pemungutan suara dengan bulan yang Anda hitung, "melepaskan" array untuk mendapatkan satu dokumen per suara dan kemudian melakukan "grup menurut" yang setara dengan menjumlahkan semua suara untuk setiap judul (Saya berasumsi judulnya unik). Kemudian mengurutkan berdasarkan jumlah suara dan membatasi output menjadi sepuluh pertama.

Anda juga memiliki kemampuan untuk mengumpulkan suara berdasarkan hari (misalnya) untuk bulan tersebut untuk melihat hari mana yang paling aktif untuk pemungutan suara:

db.posts.aggregate( [
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$unwind: "$Votes" },
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$project: { "day" : { "$dayOfMonth" : "$Votes.votedate" }  } },
    {$group: { _id: "$day", votes: {$sum:1} } },
    {$sort: {"votes": -1} },
    {$limit: 10}
] );


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongo dengan Java - temukan kueri dengan ukuran batch

  2. Mongo Atlas:Otentikasi koneksi gagal dengan database khusus

  3. Batas waktu MongoDB hanya untuk proyek tertentu

  4. Menghapus dokumen dari koleksi mongodb dari node.js

  5. Cara membuat kueri bersarang di MongoDb yang berfungsi seperti kueri pemilihan Sql bersarang