【问题标题】:MongoDB and pymongo: specify `ignore case` flag for `$in` operatorMongoDB 和 pymongo:为“$in”运算符指定“忽略大小写”标志
【发布时间】:2021-10-10 16:49:15
【问题描述】:

我需要使用 MongoDB 运行原始查询。现在我在 pymongo 中的$in 过滤器看起来像这样:

{'category': {'$in': ['fruits', 'vegetables']}}

但它显示有时类别是Fruits 并且过滤器与该值不匹配。我无法修复数据库中的所有category 数据,因为每天都在同步并且已经进行了太多检查。所以,唯一的办法就是改进过滤器(顺便说一下,这个过滤器中不仅仅是category)。

所以我想知道有什么方法可以忽略$in 运算符的大小写?


完全清楚,我现在拥有什么:

过滤器:

{'category': {'$in': ['fruits', 'vegetables']}}

数据:

{'category': 'fruits'} // match
{'category': 'Fruits'} // does not match

我需要什么:

过滤器:

{'category': {'$ignorecase_in': ['fruits', 'vegetables']}}

数据:

{'category': 'fruits'} // match
{'category': 'Fruits'} // match

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    您可以使用正则表达式 i 标志,这将使正则表达式不区分大小写。

    就像你的例子一样。

     {'category': {'$in': [new RegExp('fruits', "i" ) , new RegExp('vegetables', "i")]}}
    

    我以示例的方式向您展示了该方法。您可以应用 DRY 方法,不要为每个元素重复新的正则表达式。

    【讨论】:

      【解决方案2】:

      很快,

      对于pymongo 使用re.compileIGNORECASE 标志:

      from re import compile, IGNORECASE
      
      items.find({'category': {
          '$in': [
              compile('fruits', flags=IGNORECASE),
              compile('vegetables', flags=IGNORECASE)
          ]
      }})
      

      详细介绍,

      @me-on1 的做法是正确的。

      $in documentation says 表示$regex 运算符不能在$in 中使用(否则会出现cannot nest $ under $in 异常):

      $in 运算符可以使用正则表达式指定匹配值 /pattern/ 的形式。您不能使用 $regex 运算符表达式 在 $in 内。

      考虑以下示例:

      db.inventory.find( { 标签:{ $in: [ /^be/, /^st/ ] } })

      所以如果我被允许在$in 中使用正则表达式,那么真正的问题是如何在 python 中做到这一点?因为python不支持/pattern/形式。

      然后,我为 python 找到了类似的question 和类似的answer

      所以我剩下的就是指定忽略大小写标志:

      from re import compile, IGNORECASE
      
      items.find({'category': {
          '$in': [
              compile('fruits', flags=IGNORECASE),
              compile('vegetables', flags=IGNORECASE)
          ]
      }})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-02
        • 2015-01-15
        • 1970-01-01
        相关资源
        最近更新 更多