sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb - Multiple tekstindeks:Indeksnøglemønster for stort fejlkode 67

Problemet med din foreslåede struktur:

{
 keyword" : "Just an example query", 
 "rankings" :
    [{"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
     ...{ "rank" : 99, "domain" : "example99.com", "href" : "example99.com“}
 ]}
}

Er det selvom du nu kan gøre det

db.ranking.ensureIndex({"rankings.href":"text", "rankings.domain":"text"}) 

og kør derefter forespørgsler som:

db.ranking.find({$text:{$search:"example1"}});

dette vil nu returnere hele array-dokumentet, hvor array-elementet er matchet.

Du vil måske overveje at referere, så hvert placeringsresultat er et separat dokument, og der refereres til nøgleordene og andre metadata, for at undgå at gentage en masse information.

Så du har et søgeord/metadatadokument som:

{_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"}

og derefter et resultatdokument som:

{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"}}

hvor keyword_id linker tilbage til (referencer) nøgleordet/metadata-tabellen -- naturligvis, i praksis, vil _id'erne se ud som "_id" :"519817e508a16b447c00020e", men dette er kun for læsbarheden. Du kan nu indeksere på keyword_id, domæne og href, enten sammen eller hver for sig, afhængigt af dine forespørgselstyper, og du vil ikke få index key pattern too large error og du vil kun få et enkelt matchende dokument tilbage i stedet for et helt array.

Jeg er ikke helt klar over, hvor du har brug for fuzzy/regex stil søgninger, og om du vil søge metadata eller bare href og domæne, men jeg synes, at denne struktur burde være en renere måde at begynde at tænke på indeksering, uden at maksimere indekser, som før. Det vil også give dig mulighed for at kombinere fund på normale indekser med tekstindekser, afhængigt af dit forespørgselsmønster.

Du finder muligvis dette svar MongoDB-relationer:indlejring eller reference? nyttigt, når du overvejer din dokumentstruktur.



  1. Kan MongoDB fungere, når databasens størrelse er større end RAM?

  2. Sådan returneres kun de indlejrede dokumenter i et array fra alle dokumenter

  3. Indsæt formularværdi (json-format) i databasen ved hjælp af meteor

  4. Hvordan returnerer man kun den første forekomst af et ID med Mongoose?