2010-08-14 22 views
99

Bir mongodb sunucusuna karşı pymongo kullanarak bir normal sorgu gerçekleştirmeye çalışıyorum. Belge yapısı şu şekildedir: * Kalıpla eşleşen tüm dosyaları almak istiyorum. * Dosya. BöylePymongo ile düzenli ifadeleri gerçekleştirme

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

olarak yapıyor çalıştı Oysa ben mongodb docs göre bu mümkün olmalıdır çünkü bir şey eksik, hiçbir şey geri almak. Eğer mongo konsolunda sorguyu gerçekleştirirse, iyi çalışıyor, bu api'nin desteklemediği anlamına mı geliyor, yoksa sadece yanlış kullanıyor muyum?

cevap

117

Dönersellik aramaları pymongo'da biraz farklı bir şekilde yapılır, ancak bu kadar kolaydır. Regex olarak yapılır

aşağıdaki gibidir:

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

Bu normal ifade seçenekleri eklemek istiyorsanız o Dosya

+8

Aslında, burada kullandığınız şey, "javascript'te yapıldığı gibi" (http://docs.mongodb.org/manual/reference/operator/regex/) (ve muhtemelen başka diller de). $ regex'. @ Eric'in cevabı, biraz farklı olan python tarzıdır. – drevicko

+0

Fark nedir? İkisi de python pymongo kullanıyorlar mı? Bu mongodb sorgularının bir parçası, bu yüzden sorunu gerçekten görmüyorum. – Dexter

+5

Mignod JScript de düzenli olarak ignorecase mümkündür. db.collectionname.find ({'files': {'$ regex': '^ Dosya', '$ options': 'i'}}) –

143

ile başlar içinde öğeyi içeren bir dosya özelliğine sahip tüm belgeleri (örneğin maç olacak) davayı görmezden olarak, bu deneyin:

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

Ayrıca, regex'in başlangıçta demir attığını da unutmayın (yani:'^'ile başlayan) db dizinleri ve bu durumda çok daha hızlı çalışır. – drevicko

+0

Regex'in^ile başlaması sadece [belirli durumlarda] bir dizin kullanabilir (http://docs.mongodb.org/manual/reference/operator/query/regex/). Re.IGNORECASE kullanıldığında mongo'nun sorguyu gerçekleştirmek için bir dizin kullanamayacağına inanıyorum. – nonagon

+0

Bu kullanım bir yerde belgelenmiş mi? Bunu resmi pymongo API belgesinde bulamıyorum. – 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) 

Derleme'dan tüm karakterleri işlemek için derleme işleminden önce.

İlgili konular