Masalah dengan struktur yang Anda sarankan:
{
keyword" : "Just an example query",
"rankings" :
[{"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
...{ "rank" : 99, "domain" : "example99.com", "href" : "example99.com“}
]}
}
Apakah itu meskipun Anda sekarang dapat melakukannya
db.ranking.ensureIndex({"rankings.href":"text", "rankings.domain":"text"})
lalu jalankan kueri seperti:
db.ranking.find({$text:{$search:"example1"}});
ini sekarang akan mengembalikan seluruh dokumen array tempat elemen array cocok.
Anda mungkin ingin mempertimbangkan referensi sehingga setiap hasil peringkat adalah dokumen terpisah dan kata kunci serta meta data lainnya direferensikan, untuk menghindari pengulangan banyak informasi.
Jadi, Anda memiliki dokumen kata kunci/metadata seperti:
{_id:1, "keyword":"example query", "querydate": date, "other stuff":"other meta data"},
{_id:2, "keyword":"example query 2", "querydate": date, "other stuff":"other meta data 2"}
dan kemudian dokumen hasil seperti:
{keyword_id:1, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
... keyword_id:1, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"},
keyword_id:2, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
...keyword_id:2, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"}}
di mana kata kunci_id menautkan kembali ke (referensi) tabel kata kunci/metadata -- jelas, dalam praktiknya, _id akan terlihat seperti "_id" :"519817e508a16b447c00020e", tetapi ini hanya untuk keterbacaan. Anda sekarang dapat mengindeks pada keyword_id, domain dan href, baik bersama-sama atau terpisah, tergantung pada jenis kueri Anda dan Anda tidak akan mendapatkan index key pattern too large error
dan Anda hanya akan mendapatkan satu dokumen yang cocok daripada seluruh array yang dikembalikan.
Saya tidak sepenuhnya jelas di mana Anda memerlukan pencarian gaya fuzzy/regex dan apakah Anda akan mencari metadata atau hanya href dan domain, tetapi saya pikir struktur ini harus menjadi cara yang lebih bersih untuk mulai berpikir tentang pengindeksan, tanpa memaksimalkan indeks, seperti sebelumnya. Ini juga akan memungkinkan Anda untuk menggabungkan temuan pada indeks normal dengan indeks teks, tergantung pada pola kueri Anda.
Anda mungkin menemukan jawaban ini Hubungan MongoDB:sematan atau referensi? berguna saat mempertimbangkan struktur dokumen Anda.