Ich versuche, eine Regex-Abfrage mit Pymongo gegen einen Mongodb-Server durchzuführen. Die Dokumentstruktur ist wie folgt
{
"files": [
"File 1",
"File 2",
"File 3",
"File 4"
],
"rootFolder": "/Location/Of/Files"
}
Ich möchte alle Dateien erhalten, die dem Muster * File entsprechen. Ich habe versucht, dies als solches zu tun
db.collectionName.find({'files':'/^File/'})
Trotzdem bekomme ich nichts zurück, vermisse ich etwas, denn laut den Mongodb-Dokumenten sollte dies möglich sein. Wenn ich die Abfrage in der Mongo-Konsole durchführe, funktioniert sie einwandfrei. Bedeutet dies, dass die API sie nicht unterstützt oder verwende ich sie nur falsch?
^
Indizes (dh beginnend mit ) Indizes in der Datenbank verwenden können und in diesem Fall viel schneller ausgeführt werden.Es stellt sich heraus, dass Regex-Suchen in Pymongo etwas anders durchgeführt werden, aber genauso einfach sind.
Regex wird wie folgt durchgeführt:
Dies stimmt mit allen Dokumenten überein, die eine Dateieigenschaft haben, in der sich ein Element befindet, das mit Datei beginnt
quelle
$regex
. @ Erics Antwort ist die Python-Art, die etwas anders ist.$regex
Operator nimmt ein$options
Argument an.r'^File'
anstelle von'^File'
, um andere Probleme zu vermeidenUm die doppelte Kompilierung zu vermeiden, können Sie den mit PyMongo gelieferten bson regex-Wrapper verwenden:
Regex speichert nur die Zeichenfolge, ohne zu versuchen, sie zu kompilieren, sodass find_one das Argument dann als 'Regex'-Typ erkennen und die entsprechende Mongo-Abfrage bilden kann.
Ich denke, dieser Weg ist etwas pythonischer als die andere Top-Antwort, z.
Es lohnt sich, die bson Regex-Dokumentation zu lesen, wenn Sie Regex-Abfragen verwenden möchten, da einige Einschränkungen bestehen.
quelle
bson.regex.Regex
wird den Trick machen!Die Lösung von
re
verwendet den Index überhaupt nicht. Sie sollten Befehle verwenden wie:db.collectionname.find({'files':{'$regex':'^File'}})
(Ich kann ihre Antworten nicht kommentieren, also antworte ich hier)
quelle