【问题标题】:Query pymongo with case insensitive text使用不区分大小写的文本查询 pymongo
【发布时间】:2017-11-12 06:34:42
【问题描述】:

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

我该如何解决这个问题? 谢谢。

【问题讨论】:

    标签: python regex mongodb pymongo


    【解决方案1】:

    听起来你想要一个单词边界\b

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

    因此,如果您提供WWFwwf,那么它只会匹配到“单词”的末尾,而不是超出它。

    请注意,不区分大小写的搜索和未使用插入符号 ^ 锚定到字符串开头的搜索需要完整的集合扫描并且效率不高。

    如果匹配到字符串的开头,您应该使用插入符号,并且您可能应该将大小写规范化为用于搜索的文档属性,因此您也不需要“不区分大小写”选项。要在搜索中使用索引,这两件事是必需的。请参阅文档中的$regex

    【讨论】:

    • 正是我想要的。是的,我应该在插入 mongodb 时规范化文本数据。
    【解决方案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 似乎只包含单词字符,因此在这种情况下,单词边界就足够了。

    【讨论】:

      猜你喜欢
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多