Il problema con la struttura suggerita:
{
keyword" : "Just an example query",
"rankings" :
[{"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
...{ "rank" : 99, "domain" : "example99.com", "href" : "example99.com“}
]}
}
È anche se ora puoi farlo
db.ranking.ensureIndex({"rankings.href":"text", "rankings.domain":"text"})
e quindi esegui query come:
db.ranking.find({$text:{$search:"example1"}});
questo ora restituirà l'intero documento dell'array in cui l'elemento dell'array è abbinato.
Potresti prendere in considerazione l'idea di fare riferimento in modo che ogni risultato della classifica sia un documento separato e le parole chiave e altri metadati siano referenziati, per evitare di ripetere molte informazioni.
Quindi, hai un documento di parole chiave/metadati come:
{_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"}
e poi un documento dei risultati come:
{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"}}
dove keyword_id rimanda a (riferimenti) alla tabella delle parole chiave/metadati -- ovviamente, in pratica, gli _id saranno simili a "_id":"519817e508a16b447c00020e", ma questo è solo per la leggibilità. Ora puoi indicizzare su keyword_id, dominio e href, insieme o separatamente, a seconda dei tipi di query e non otterrai l'index key pattern too large error
e otterrai solo un singolo documento corrispondente anziché un intero array restituito.
Non sono del tutto chiaro su dove hai bisogno di ricerche in stile fuzzy/regex e se cercherai metadati o solo href e dominio, ma penso che questa struttura dovrebbe essere un modo più pulito per iniziare a pensare all'indicizzazione, senza massimizzare gli indici, come prima. Ti consentirà inoltre di combinare i risultati sugli indici normali con gli indici di testo, a seconda del modello di query.
Potresti trovare questa risposta Relazioni MongoDB:incorporare o fare riferimento? utile quando si considera la struttura del documento.