2010-08-14 43 views
99

Tôi đang cố thực hiện truy vấn regex bằng pymongo đối với máy chủ mongodb. Cấu trúc tài liệu như sauThực hiện truy vấn regex với pymongo

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

Tôi muốn nhận tất cả các tệp khớp với mẫu * Tệp. Tôi đã thử làm như vậy

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

Tuy nhiên, tôi không nhận được gì, tôi thiếu thứ gì đó vì theo tài liệu mongodb này nên có thể. Nếu tôi thực hiện các truy vấn trong giao diện điều khiển mongo nó hoạt động tốt, điều này có nghĩa là api doesnt hỗ trợ nó hoặc tôi chỉ sử dụng nó không chính xác

Trả lời

117

Biến các tìm kiếm regex được thực hiện một chút khác nhau trong pymongo nhưng chỉ là dễ dàng.

Regex được thực hiện như sau:

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

này sẽ phù hợp tất cả các tài liệu mà có một tài sản file mà có một mục trong đó bắt đầu với File

+8

Thực ra, những gì bạn có ở đây cũng là [cách nó được thực hiện trong javascript] (http://docs.mongodb.org/manual/reference/operator/regex/) (và có lẽ cả các ngôn ngữ khác nữa) nếu bạn sử dụng ' $ regex'. @ Eric của câu trả lời là cách python đó là một chút khác nhau. – drevicko

+0

sự khác biệt là gì? Cả hai đều sử dụng pymongo python đúng không? Nó là một phần của các truy vấn mongodb vì vậy tôi không thấy vấn đề thực sự. – Dexter

+5

Ignorecase là có thể trong regex của mongodb JScript cũng viz. db.collectionname.find ({'files': {'$ regex': '^ File', '$ options': 'i'}}) –

143

Nếu bạn muốn bao gồm tùy chọn biểu thức chính quy (ví dụ như bỏ qua trường hợp), hãy thử này:

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

Lưu ý rằng regex bị neo khi bắt đầu (ví dụ: bắt đầu bằng'^') có thể sử dụng các chỉ mục trong db và sẽ chạy nhanh hơn nhiều trong trường hợp đó. – drevicko

+0

Bắt đầu của Regex với^chỉ có thể sử dụng chỉ mục trong [trường hợp nhất định] (http://docs.mongodb.org/manual/reference/operator/query/regex/). Khi sử dụng re.IGNORECASE tôi tin rằng mongo không thể sử dụng chỉ mục để thực hiện truy vấn. – nonagon

+0

Tài liệu này có được sử dụng ở đâu đó không? Tôi không thể tìm thấy điều này trong tài liệu chính thức về 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) 

Thoát mẫu trước khi biên dịch xử lý tất cả ký tự.

Các vấn đề liên quan