2010-08-14 12 views
99

Próbuję wykonać kwerendę wyrażeń regularnych przy użyciu pymongo przeciwko serwerowi mongodb. Struktura dokumentu jest następująca:Wykonywanie zapytań regex z pymongo

{ 
    "files": [ 
    "File 1", 
    "File 2", 
    "File 3", 
    "File 4" 
    ], 
    "rootFolder": "/Location/Of/Files" 
} 

Chcę uzyskać wszystkie pliki pasujące do wzorca * Plik. Próbowałem robić to jako taki

db.collectionName.find({'files':'/^File/'}) 

Jednak ja dostać nic z powrotem, mam czegoś brakuje, ponieważ zgodnie z docs MongoDB powinno to być możliwe. Jeśli wykonuję zapytanie w konsoli mongo, to działa dobrze, czy to oznacza, że ​​api go nie obsługuje, czy też używam go niepoprawnie?

Odpowiedz

117

Okazuje się, że wyszukiwanie regex odbywa się nieco inaczej w pymongo, ale jest równie proste.

Regex odbywa się w następujący sposób:

db.collectionname.find({'files':{'$regex':'^File'}}) 

ten będzie pasował do wszystkich dokumentów, które mają właściwości plików, który ma element ciągu, który zaczyna się Plik

+8

Właściwie to, co tu masz, to także [sposób, w jaki jest to zrobione w javascript] (http://docs.mongodb.org/manual/reference/operator/regex/) (i prawdopodobnie także w innych językach), jeśli używasz ' $ regex'. Odpowiedź @ Eric jest sposobem python, który jest trochę inny. – drevicko

+0

jaka jest różnica? Obaj używają python pymongo, prawda? Jest to część zapytań mongodów, więc naprawdę nie widzę problemu. – Dexter

+5

Ignorecase jest możliwe w wyrażeniu mongodb JScript także viz. db.collectionname.find ({'files': {'$ regex': '^ File', '$ options': 'i'}}) –

143

Jeśli chcesz obejmować regularne opcje wyrażenie (takie jak ignorować sprawy), spróbuj tego:

import re 
regx = re.compile("^foo", re.IGNORECASE) 
db.users.find_one({"files": regx}) 
+5

Zwróć także uwagę, że regex zakotwiczone na początku (np .: zaczynając od'^') są w stanie użyć indeksy w db, i będzie działać znacznie szybciej w tym przypadku. – drevicko

+0

Regex zaczyna się od^może używać indeksu w [określonych przypadkach] (http://docs.mongodb.org/manual/reference/operator/query/regex/). Używając re.IGNORECASE wierzę, że mongo nie może użyć indeksu do wykonania zapytania. – nonagon

+0

Czy to użytkowanie zostało gdzieś udokumentowane? Nie mogę znaleźć tego w oficjalnym dokumencie API pymongo. – Hieu

0
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) 

Ucieczka przed wzorcem przed kompilacją obsługuje wszystkie znaki.

Powiązane problemy