2017-06-10 132 views
1

以下查詢pymongo是我使用pymongo如何查詢從我的MongoDB的數據:與不區分大小寫文本

def is_philippine_facebook(self,facebook_user): 
     is_philippine = False 
     db_server = self.ConfigSectionMap('db_server') 
     database_name = db_server['database'] 
     db = self.client[database_name] 
     cursor = db[collection_name].find({ 
       'isPhilippine':True, 
       'facebook_user': re.compile('@'+facebook_user, re.IGNORECASE) 
      }) 
     for document in cursor: 
      if document is not None: 
       is_philippine = True 
       break 
     return is_philippine 

其實,我想查詢具有一定facebook_user與incasesensitive選項記錄。但是,查詢返回許多不正確的結果。 例如,如果facebook_userWWF,與WWF_XYZ記錄將被退回。

我該如何解決這個問題? 謝謝。

回答

0

聽起來像是你想有一個單詞邊界\b

'facebook_user': re.compile('@'+ facebook_user +'\\b', re.IGNORECASE) 

因此,如果您對供應WWFwwf那麼它只匹配到「詞」的結尾,而不是超越它。

作爲說明,不區分大小寫的搜索未使用插入符號的字符串搜索到字符串的開頭,需要完整的收集掃描,效率不高。

如果匹配的字符串,你應該使用插入符號,你可能應該正常化情況下,作爲文檔屬性進行搜索,這樣你就不需要「不區分大小寫」選項,無論是年初。這兩件事是索引在搜索中使用所必需的。見$regex文檔

+0

正是我想要的。是的,我應該在插入到mongodb時規範化文本數據。 – lenhhoxung

2

在使用下列修復:

re.compile(r'@{0}\b'.format(facebook_user), re.IGNORECASE) 

regex demo

圖案的詳細資料

  • @WWF - 字面@WWF
  • \b - 字邊界(需要比字母,數字或_,或@WWF後字符串的末尾以外的炭)

如果facebook_user可能包含特殊字符,你需要使用

re.compile(r'(?<!\w)@{0}(?!\w)'.format(re.escape(facebook_user)), re.IGNORECASE) 

但是,facebook_user似乎只包含字符,所以在這種情況下字邊界應該足夠。