【问题标题】:PyMongo $in + $regexPyMongo $in + $正则表达式
【发布时间】:2013-11-20 22:54:52
【问题描述】:

如何在 PyMongo 中将 $regex 与 $in 结合使用?

我想搜索/*.heavy.*//*.metal.*/

我在 python 中尝试过但没有成功:

db.col.find({'music_description' : { '$in' : [ {'$regex':'/*.heavy.*/'} ]} })

Mongo shell 中的等价物是:

db.inventory.find( { music_description: { $in: [ /heavy/, /metal/ ] } } )

【问题讨论】:

    标签: mongodb-query pymongo


    【解决方案1】:

    使用 python 正则表达式。

    import re
    db.col.find({'music_description': {'$in': [ re.compile('.*heavy.*'), re.compile('.*metal.*')]}})
    

    【讨论】:

    • 嗯。奇迹般有效。不知何故,尽管它很合适,但它也不是很明显——某种正则表达式字符串似乎是更明显的选择(我想是因为从字符串转换为已编译的正则表达式,然后再转换为 bson 的字符串)。谢谢你的帖子。
    【解决方案2】:

    为什么还要费心使用 $in 呢? 您通过评估列表中每个值的字段来浪费处理,并且由于每个值都是正则表达式,因此它有自己的性能考虑, 根据您的查询字符串获得多长时间,将它们包装在一个正则表达式中并避免一起使用 $in 查询可能是谨慎的

    import re
    db.col.find({'music_description': re.compile('heavy|metal')})
    

    在 mongo shell 中类似

    db.inventory.find({music_description: /heavy|metal/})
    

    至于 [user2998367] 的答案,您正在浪费效率编译带有贪婪通配符的正则表达式,仅用于匹配目的,python 中 re.search 和 re.match 之间的区别需要使用通配符re.search 的目的,但 re.match 的行为类似于“字符串中的任何位置”,MongoDB 也是如此,只有在您打算提取时才真正需要它,无论如何查询后您需要稍后执行此操作,或者如果您正在在您特别需要 re.search 而不是 re.match 的其他地方重用已编译的正则表达式

    【讨论】:

    • 他正在尝试检查数组元素,而不是“music_description”本身。
    • $in 查询是一种用途广泛的查询。第一个是明显的用例,它读作“一些左手值在这个可能的右手值数组中”,这就是他似乎在这里查询的内容(名称music_description 绝不表示它是值数组...)另一种用途是您正在考虑的,“此数组左手值包含这些右手值中的一个或任何一个”,也可以写为db.s.find({'someArray': {$in: oneValue}})而不是最后,为简洁起见,该数组也称为db.s.find({'someArray': oneValue})
    猜你喜欢
    • 2017-07-03
    • 2015-10-28
    • 2020-10-26
    • 2014-06-06
    • 2018-11-24
    • 2016-11-10
    • 2011-03-29
    • 2017-08-12
    相关资源
    最近更新 更多