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

Hvordan forespørges dokumenter i mongodb (pymongo), hvor alle søgeord findes i et felt?

Overvej at bruge et tekstindeks med en $text søg . Det kan være en langt bedre løsning end at bruge regulære udtryk. Tekstsøgning returnerer dog dokumenter baseret på en scoringsalgoritme, så du får muligvis nogle resultater, som ikke har alle de søgeord, du leder efter.

Hvis du ikke kan eller ønsker at tilføje et tekstindeks til dette felt, vil det være ret besværligt at bruge et enkelt regulært udtryk, fordi du ikke kender rækkefølgen, hvori disse ord vises. Jeg påstår ikke, at det er umuligt at skrive, men du vil ende med en forfærdelig vederstyggelighed selv for regex-standarder. Det ville være langt nemmere at bruge regex-operatoren flere gange ved at bruge $and operatør.

Brug af et mellemrum som skillemåler vil også mislykkes, når ordet er i begyndelsen eller slutningen af ​​strengen eller efterfulgt af et punktum eller komma. Brug ordgrænse-tokenet (\b ) i stedet for.

collection.find(
    { $and : [
              {'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
         ]
    });

Husk, at dette er en meget langsom forespørgsel, fordi den vil køre disse tre regulære udtryk på hvert enkelt dokument i samlingen. Når dette er en præstationskritisk forespørgsel, skal du seriøst overveje, om et tekstindeks virkelig ikke duer. Hvis dette ikke lykkes, ville det sidste dråbe at forstå være at udtrække eventuelle søgeord fra documenttextfield felt nogen kunne søge efter (som kan være hvert eneste unikke ord i det) i et nyt array-felt documenttextfield_keywords , opret et normalt indeks på det felt, og søg i det felt med $all operatør (i så fald kræves intet regulært udtryk).




  1. Bedste fremgangsmåder til effektiv lagring af md5-hash i MongoDB

  2. Hvordan failover til ny Master node, når du bruger Redis med Sentinel og redis-py?

  3. Go JSON-afkodning er meget langsom. Hvad ville være en bedre måde at gøre det på?

  4. Redis zrevrangebyscore, sortering andet end leksikografisk rækkefølge