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?