sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur frågar man efter dokument i mongodb (pymongo) där alla nyckelord finns i ett fält?

Överväg att använda ett textindex med en $text sök . Det kan vara en mycket bättre lösning än att använda reguljära uttryck. Textsökning returnerar dock dokument baserat på en poängalgoritm, så du kan få resultat som inte har alla nyckelord du letar efter.

Om du inte kan eller vill lägga till ett textindex i det här fältet skulle det vara jobbigt att använda ett enda reguljärt uttryck eftersom du inte vet i vilken ordning dessa ord visas. Jag påstår inte att det är omöjligt att skriva, men du kommer att sluta med en hemsk styggelse även för regex-standarder. Det skulle vara mycket lättare att använda regexoperatorn flera gånger genom att använda $and operatör.

Att använda ett blanksteg som avgränsare kommer också att misslyckas när ordet är i början eller slutet av strängen eller följs av en punkt eller kommatecken. Använd ordgränssymbolen (\b ) istället.

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

Tänk på att det här är en väldigt långsam fråga, eftersom den kommer att köra dessa tre reguljära uttryck på varje enskilt dokument i samlingen. När detta är en prestandakritisk fråga, överväg allvarligt om ett textindex verkligen inte duger. Om detta misslyckas är det sista droppen att förstå att extrahera alla nyckelord från documenttextfield fält någon kan söka efter (som kan vara varje unikt ord i det) i ett nytt array-fält documenttextfield_keywords , skapa ett normalt index på det fältet och sök i det fältet med $all operatör (inget reguljärt uttryck krävs i så fall).




  1. Händelse på nyckel löper ut

  2. MongoDB - Släpp en databas

  3. Hur spolar jag redis db från python redis?

  4. Upsert inbäddat dokument i yiimongodbsuite