2010-08-14 52 views
99

我正在嘗試使用pymongo對mongodb服務器執行正則表達式查詢。文檔結構如下使用pymongo執行正則表達式查詢

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

我想獲取所有匹配模式*文件的文件。我試着這樣做這樣

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

但我什麼也沒有回來,我失去了一些東西,因爲根據MongoDB的文檔,這應該是可能的。如果我在mongo控制檯中執行查詢,它工作正常,這是否意味着api不支持它,或者我只是不正確地使用它

回答

117

原來,pymongo中的正則表達式搜索有點不同,但同樣簡單。

正則表達式是爲完成如下:

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

這將匹配有,有一個項目中,與文件

+8

實際上,你在這裏也是[它在javascript中完成的方式](http://docs.mongodb.org/manual/reference/operator/regex/)(也可能是其他語言),如果你使用' $ regex'。 @埃裏克的回答是python的方式有點不同。 – drevicko 2013-08-13 23:33:47

+0

有什麼區別?他們都使用python pymongo正確嗎?它是mongodb查詢的一部分,所以我沒有真正看到問題。 – Dexter 2014-12-22 18:40:26

+5

Ignorecase在mongodb JScript的正則表達式中也是可能的。 db.collectionname.find({'files':{'$ regex':'^ File','$ options':'i'}}) – 2015-04-25 10:37:20

143

如果你想包括正則表達式選項啓動一個文件屬性的所有文檔(如如忽略大小寫),試試這個:

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

還要注意,正則表達式的錨定在開始處(即:以'^'開頭)能夠使用在數據庫中的索引,並在這種情況下運行得更快。 – drevicko 2013-08-13 23:31:48

+0

正則表達式以^開頭,只能在[某些情況下]使用索引(http://docs.mongodb.org/manual/reference/operator/query/regex/)。在使用re.IGNORECASE時,我相信mongo不能使用索引來執行查詢。 – nonagon 2015-04-08 18:08:38

+0

這種用法記錄在某處嗎?我在官方的pymongo API文檔中找不到這個。 – Hieu 2017-10-16 22:38:00

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) 

在編譯之前轉義模式處理所有字符。