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

desain skema mongodb untuk blog

Article {
  "_id" : "A",
  "title" : "Hello World",
  "user_id" : 12345,
  "text" : 'My test article',

  "comments" : [
    { 'text' : 'blah', 'user_id' : 654321, 'votes' : [987654]},
    { 'text' : 'foo', 'user_id' : 987654, 'votes' : [12345, 654321] },
    ...
  ]
}

Premis dasar di sini adalah bahwa saya telah menyarangkan Comments di dalam Article . Votes hanya berlaku untuk Comments , jadi mereka telah disimpan sebagai array dengan masing-masing Comment . Dalam hal ini, saya baru saja menyimpan user_id. Jika Anda ingin menyimpan lebih banyak informasi (time_created, dll.), Anda dapat memilih array objek:

... 'votes' : [ { user_id : 987654, ts : 78946513 } ] ...

Cara melakukan kueri Anda secara efisien:

db.articles.find( { _id : 'A' } )

Ini mendapatkan semuanya dengan satu permintaan. Anda mungkin harus melakukan beberapa logika sisi klien untuk menghitung suara per komentar, tetapi ini cukup sepele.

db.articles.ensureIndex( { "comments.user_id" : 1 } )
db.articles.find( { "comments.user_id" : 987654 } ) // returns all document fields

Indeks akan memungkinkan pencarian komentar di dalam dokumen secara efisien.

Saat ini tidak ada cara untuk mengekstrak hanya kecocokan dari sub-array. Permintaan ini sebenarnya akan mengembalikan semua artikel dengan komentar oleh pengguna itu. Jika ini berpotensi terlalu banyak data, Anda dapat melakukan pemangkasan.

db.articles.find( { "comments.user_id" : 987654 }, { "title" : 1, "comments.user_id" : 1 })
db.articles.ensureIndex( { "comments.votes" : 1 } )
db.articles.find( { "comments.votes" : 987654 } )

Sekali lagi, ini akan mengembalikan semua Artikel, bukan hanya komentar.

Ada trade-off yang harus dilakukan di sini. Mengembalikan artikel mungkin tampak seperti kami membawa kembali terlalu banyak data. Tapi apa yang Anda rencanakan untuk ditampilkan kepada pengguna saat Anda membuat kueri #3?

Mendapatkan daftar "komentar yang saya pilih" tidak terlalu berguna tanpa komentar itu sendiri. Tentu saja komentar tidak terlalu berguna tanpa artikel itu sendiri (atau setidaknya hanya judul).

Sebagian besar waktu, kueri #3 beralih ke gabungan dari Votes ke Comments ke Article . Jika itu masalahnya, mengapa tidak mengembalikan Artikel saja?




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara menambahkan definisi makro di cmake?

  2. Balas informasi kepala dan tambahkan array ekstrak ke hasil yang sama

  3. Bagaimana menemukan dokumen yang cocok dengan beberapa kriteria

  4. Kompas mongodb musim semi tidak memiliki data/koleksi yang dibuat

  5. Konversikan kondisi pembuat kueri ke operasi MongoDB termasuk larik subdokumen bersarang