簡體   English   中英

用不區分大小寫的文本查詢pymongo

[英]Query pymongo with case insensitive text

以下是我如何使用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

實際上,我想查詢具有case insensitive選項的某個facebook_user記錄。 但是,查詢返回許多不正確的結果。 例如,如果facebook_userWWF ,則將返回帶有WWF_XYZ記錄。

我怎樣才能解決這個問題? 謝謝。

使用以下修復程序:

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

參見regex演示

圖案細節

  • @WWF文字@WWF
  • \\b單詞邊界(要求​​字母,數字或_@WWF之后的字符串末尾以外的字符)

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

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

但是, facebook_user似乎僅包含單詞字符,因此在這種情況下,單詞邊界確實足夠。

聽起來像您想要一個單詞邊界\\b

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

因此,如果您提供WWFwwf則它只會匹配到“單詞”的末尾,而不會超出它。

需要注意的是,不區分大小寫的搜索不以脫字符^錨定到字符串開頭的搜索需要完全收集掃描,並且效率不高。

如果與字符串的開頭匹配,則應使用插入符號,並且可能應將大小寫標准化為用於搜索的文檔屬性,因此也不需要“不區分大小寫”選項。 要在搜索中使用索引,需要這兩件事。 請參閱文檔中的$regex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM