Durchführen von regex Abfragen mit pymongo
Frage
Ich versuche, eine Regex Abfrage mit pymongo gegen einen mongodb Server auszuführen. Die Dokumentstruktur wird wie folgt
{
"files": [
"File 1",
"File 2",
"File 3",
"File 4"
],
"rootFolder": "/Location/Of/Files"
}
Ich möchte alle Dateien erhalten, die das Muster * File entsprechen. Ich habe versucht, dies zu tun als solche
db.collectionName.find({'files':'/^File/'})
Doch ich bekomme nichts zurück, bin ich etwas fehle, weil nach dem mongodb docs sollte dies möglich sein. Wenn ich die Abfrage in der Konsole es gut funktioniert Mongo ausführen, bedeutet dies die Unterstützung api tut es oder bin ich benutze es nur falsch
Lösung 2
Turns out regex Suchen sind ein wenig anders in pymongo gemacht, aber ist genauso einfach.
Regex geschieht wie folgt:
db.collectionname.find({'files':{'$regex':'^File'}})
Damit wird alle Dokumente gefunden, die eine Datei Eigenschaft haben, dass ein Element in dem beginnt mit Datei hat
Andere Tipps
Wenn Sie reguläre Ausdrücke (zB ignorieren Fall) aufnehmen möchten, versuchen Sie dies:
import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})
Um die Doppel Kompilierung vermeiden Sie die BSON regex verwenden können Wrapper, dass mit PyMongo kommt:
>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})
Regex speichert nur die Zeichenfolge, ohne zu versuchen, es zu kompilieren, so find_one dann das Argument als Typ ‚Regex‘ erkennen kann und die entsprechende Mongo Abfrage bilden.
Ich fühle mich auf diese Weise etwas mehr Pythonic als die anderen Top-Antwort, z.
>>> db.collectionname.find({'files':{'$regex':'^File'}})
Es lohnt sich auf der BSON Regex Dokumentation zu lesen, wenn Sie planen, regex Abfragen zu verwenden, da gibt es einige Einschränkungen.
Die Lösung von re
den Index nicht überhaupt.
Sie sollten Befehle wie verwenden:
db.collectionname.find({'files':{'$regex':'^File'}})
(Ich kann nicht Kommentar unterhalb ihrer Antworten, so antworte ich hier)
import re
def get_pattern_query(pattern,starting_with=False,ending_with=False,ignore_case=False):
start = '^' if starting_with else '.*'
end = '$' if ending_with else '.*'
pattern = start + re.escape(pattern) + end
return re.compile(pattern, re.IGNORECASE) if ignore_case else re.compile(pattern)
Escaping das Muster , bevor Griffe alle Zeichen kompilieren.