Próbuję wykonać zapytanie regex przy użyciu pymongo na serwerze mongodb. Struktura dokumentu jest następująca
{
"files": [
"File 1",
"File 2",
"File 3",
"File 4"
],
"rootFolder": "/Location/Of/Files"
}
Chcę uzyskać wszystkie pliki, które pasują do wzorca * Plik. Próbowałem to zrobić jako taki
db.collectionName.find({'files':'/^File/'})
Jednak nic nie otrzymuję, brakuje mi czegoś, ponieważ zgodnie z dokumentacją mongodb powinno to być możliwe. Jeśli wykonam zapytanie w konsoli mongo, działa dobrze, czy to oznacza, że api go nie obsługuje, czy po prostu używam go nieprawidłowo
^
) mogą używać indeksów w bazie danych i będą w takim przypadku działać znacznie szybciej.Okazuje się, że wyszukiwanie wyrażeń regularnych odbywa się nieco inaczej w pymongo, ale jest równie łatwe.
Regex jest wykonywany w następujący sposób:
db.collectionname.find({'files':{'$regex':'^File'}})
Spowoduje to dopasowanie wszystkich dokumentów, które mają właściwość files, w której znajduje się element rozpoczynający się od pliku
źródło
$regex
. @ Eric odpowiada nieco inaczej w języku Pythona.$regex
Operator Mongo przyjmuje$options
argument.r'^File'
zamiast,'^File'
aby uniknąć innego problemuAby uniknąć podwójnej kompilacji, możesz użyć opakowania wyrażeń regularnych bson, które jest dostarczane z PyMongo:
>>> regx = bson.regex.Regex('^foo') >>> db.users.find_one({"files": regx})
Regex po prostu przechowuje ciąg bez próby jego kompilacji, więc find_one może następnie wykryć argument jako typ „Regex” i utworzyć odpowiednie zapytanie Mongo.
Wydaje mi się, że ten sposób jest nieco bardziej Pythonic niż inna najlepsza odpowiedź, np:
>>> db.collectionname.find({'files':{'$regex':'^File'}})
Warto przeczytać dokumentację bson Regex, jeśli planujesz używać zapytań regex, ponieważ istnieją pewne zastrzeżenia.
źródło
bson.regex.Regex
da rade!Rozwiązanie w
re
ogóle nie używa indeksu. Powinieneś używać poleceń takich jak:db.collectionname.find({'files':{'$regex':'^File'}})
(Nie mogę komentować poniżej ich odpowiedzi, więc odpowiadam tutaj)
źródło