MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie frage ich Dokumente in Mongodb (Pymongo) ab, in denen alle Schlüsselwörter in einem Feld vorhanden sind?

Erwägen Sie die Verwendung eines Textindex mit einem $text suchen . Dies ist möglicherweise eine weitaus bessere Lösung als die Verwendung regulärer Ausdrücke. Die Textsuche gibt jedoch Dokumente basierend auf einem Bewertungsalgorithmus zurück, sodass Sie möglicherweise einige Ergebnisse erhalten, die nicht alle gesuchten Schlüsselwörter enthalten.

Wenn Sie diesem Feld keinen Textindex hinzufügen können oder wollen, wäre die Verwendung eines einzelnen regulären Ausdrucks ziemlich mühsam, da Sie die Reihenfolge nicht kennen, in der diese Wörter erscheinen. Ich behaupte nicht, dass es unmöglich ist zu schreiben, aber Sie werden selbst für Regex-Standards mit einem schrecklichen Gräuel enden. Es wäre viel einfacher, den Regex-Operator mehrmals zu verwenden, indem Sie $and verwenden Operator.

Außerdem schlägt die Verwendung eines Leerzeichens als Trennzeichen fehl, wenn das Wort am Anfang oder Ende der Zeichenfolge steht oder von einem Punkt oder Komma gefolgt wird. Verwenden Sie das Wortgrenzen-Token (\b ) statt.

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

Denken Sie daran, dass dies eine wirklich langsame Abfrage ist, da diese drei regulären Ausdrücke für jedes einzelne Dokument der Sammlung ausgeführt werden. Wenn es sich um eine leistungskritische Abfrage handelt, sollten Sie ernsthaft überlegen, ob ein Textindex wirklich nicht ausreicht. Andernfalls wäre der letzte Strohhalm, alle Schlüsselwörter aus dem documenttextfield zu extrahieren Feld, nach dem jemand suchen könnte (was jedes einzelne Wort darin sein könnte) in ein neues Array-Feld documenttextfield_keywords , erstellen Sie einen normalen Index für dieses Feld und suchen Sie in diesem Feld mit $all Betreiber (in diesem Fall ist kein regulärer Ausdruck erforderlich).